using System.Collections.Generic
using System.Linq
using System.Text
using System.Data.Entity
using System.ComponentModel.DataAnnotations
using System.Data.Entity.ModelConfiguration
using System.Data.Entity.ModelConfiguration.Configuration
namespace CodeFirstDemo
{
/// <summary>
/// 实体注册Helper接口
/// </summary>
public interface IEntityRegstHelper
{
void RegTo(ConfigurationRegistrar confRegistrar)
}
// 客户
public class Customer
{
public int CustomerID { getset}
public String CustomerName { getset}
public string Address { getset}
}
// 客户实体的注册Helper
public class CustomerRegstHelper : IEntityRegstHelper
{
public void RegTo(ConfigurationRegistrar confRegistrar)
{
confRegistrar.Add<Customer>(new EntityTypeConfiguration<Customer>())
}
}
public class MyDbContext : DbContext
{
List<IEntityRegstHelper>entityRegstHelperlist
// 添加实体注册
public void AddEntityRegHelper(IEntityRegstHelper r)
{
if (entityRegstHelperlist == null)
entityRegstHelperlist = new List<IEntityRegstHelper>()
entityRegstHelperlist.Add(r)
}
//public DbSet<Customer>Customers { getset}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
// 动态地加入实体
if (entityRegstHelperlist != null)
{
foreach (IEntityRegstHelper r in entityRegstHelperlist)
r.RegTo(modelBuilder.Configurations)
}
}
}
class Program
{
static void Main(string[] args)
{
using (var db = new MyDbContext())
{
db.AddEntityRegHelper(new CustomerRegstHelper())
var c = new Customer()
{
CustomerName = "长沙市大风通讯有限公司",
Address = "长沙市"
}
db.Set<Customer>().Add(c)
db.SaveChanges()
var query = from customer in db.Set<Customer>()
select customer
foreach (var cq in query)
{
Console.WriteLine("客户: {0}, 地址:{1}", cq.CustomerName, cq.Address)
}
Console.WriteLine("按任意键退出")
Console.ReadKey()
}
}
}
}
1. 使用CodeFirst方式创建数据库我们新建一个控制台项目,项目中添加两个Model:Author和Blog以及DbContext。 DbContext的添加方式如下:
项目上右键->添加->新建项->ADO.NET Entity Data Model->Empty Code First model
项目代码如下:
1 //默认生成的数据表名为类名+字母s,这里使用TableAttribute来指定数据表名为T_Authors
2 [Table("T_Authors")]
3 public class Author
4 {
5 public int Id { setget}
6 public string Name { setget}
7 /*
8 此处定义了Blog类型的属性,所以要确保Blog类中至少要有一个表示主键的字段,即public int Id { setget}。
否则在生成数据表时会报错:"EntityType 'Blog' has no key defined. Define the key for this EntityType.
9 Blogs: EntityType: EntitySet 'Blogs' is based on type 'Blog' that has no keys defined."
10 */
11 public virtual ICollection<Blog>Blogs { setget}
12 }
13
14 [Table("T_Blogs")]
15 public class Blog
16 {
17 public int Id { setget}
18 public string Title { setget}
19 public DateTime Time { setget}
20 public int AuthorId { setget}
21 public virtual Author Author { setget}
22 }
23
24 public class MyDbContext: DbContext
25 {
26 public MyDbContext()
27 : base("name=MyDbContext")
28 {
29 }
30 //DbContext会根据配置文件中connectionStrings指定的数据库名称来建立数据库
31 //DbContext根据DbSet属性的类型来创建数据表,这里指定了Author类型的属性,所以会生成T_Authors数据表
32 public virtual DbSet<Author>Authors { setget}
33 }
CodeFirst方式会根据配置文件中的配置生成数据库,这里小编使用的是MYSQL数据库,配置文件如下:
1 <!--EF for MYSQL-->
2 <entityFramework codeConfigurationType="MySql.Data.Entity.MySqlEFConfiguration, MySql.Data.Entity.EF6">
3 <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
4 <providers>
5 <provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6" />
6 </providers>
7 </entityFramework>
8 <connectionStrings>
9 <add name="MyDbContext" connectionString="server=localhostport=3306database=EFuid=rootpassword=root" providerName="System.Data.MySqlClient" />
10 </connectionStrings>
PS:小编使用的是EF6和MYSQL数据库,所以要在项目中添加对Mysql.Data.Entity.EF6以及EntityFrameword 6.0的引用。
到此,我们已经完成生成数据库的工作,接下来在Main方法中写两行代码:
1 using (var db = new ManagerDb())
2 {
3 db.Authors.Add(new Author() { Name = "xfh" })
4 db.SaveChanges()
5 }
1。 选择其中的两个表作为示例. 在工程中添加ADO先简单说一下如何创建环境.NET Entity Data Model.. 在Visual Studio中创建一个示例工程,请直接跳过。如果你对这些步骤了如指掌。最简单的莫过于ConsoleApplication 2,表Teacher和表Course 添.EntityFramework Core 1.1是如何创建DbContext实例的呢
using (var context = new EFCoreContext()){}接着通过重载OnConfiguring来配置EF Core上下文实例,如下。public class EFCoreContext: DbContext{ protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) =>optionsBuilder.UseSqlServer(@"Server=.Database=EFTestTrusted_Connection=True")}【注意】:重载OnConfiguring和之前EF版本中的OnModelCreating创建模型不一样,OnModelCreating创建模型上下文只实例化一次,但是OnConfiguring每实例化一个上下文时都会被调用一次,所以OnConfiguring能充分利用上下文中的构造函数或者其他数据。在EF 6.x中对于上下文有许多构造函数,例如连接字符串传参,在EF Core 1.1中也是可以的如下:复制代码public class EFCoreContext: DbContext{ private readonly string _connectionStringpublic EFCoreContext(string connectionString) { _connectionString = connectionString} protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) =>optionsBuilder.UseSqlServer(_co...".),当然它也能被显式调用.UseSqlServer("。
在EF 6optionsBuilder.UseSqlServer(_connectionString)"
public IActionResult Index()
{
_contextOptions = new DbContextOptionsBuilder()
}
}
复制代码
看到这里我们看到确确实实不再需要重载OnConfiguring,所以OnConfiguring能充分利用上下文中的构造函数或者其他数据: base(options)
{
}
}
复制代码
复制代码
public class HomeController
public EFCoreContext(string connectionString)
{
_connectionString = connectionStringDatabase=EFTest: DbContext
{
public EFCoreContext(DbContextOptions options)
:
复制代码
public class EFCoreContext : DbContext
{
private readonly string _connectionString,为什么会这样尼.x中对于上下文有许多构造函数.UseSqlServer(@",例如连接字符串传参,所以用它可以为每一个上下文的实例使用相同的options,如下,这个主要用在当在DI容器中创建DbContext实例时会用到,在EF Core 1
}
复制代码
使用不带依赖注入的DbContextOptions
在DbContext的构造函数中我们可以接受一个DbContextOptions对象Server=,但是OnConfiguring每实例化一个上下文时都会被调用一次.Options
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
=>:重载OnConfiguring和之前EF版本中的OnModelCreating创建模型不一样:
复制代码
public class EFCoreContext,但是OnConfiguring将还是会被一直重载和调用Trusted_Connection=True,OnModelCreating创建模型上下文只实例化一次
}
【注意】: DbContext
{
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
=>
using (var context = new EFCoreContext(_contextOptions))
{
}
return View(),如下using (var context = new EFCoreContext())
{
}
接着通过重载OnConfiguring来配置EF Core上下文实例。
public class EFCoreContextoptionsBuilder,通过创建DbCOntextOptions对象来与上下文隔离: Controller
{
private static DbContextOptions _contextOptions)
,因为我们在配置中注入上下文它会调用构造函数并同时来对OnConfiguring进行适当的调整.1中也是可以的如下展开
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)