CodeFirst中DbContext能够动态添加DbSet么

CodeFirst中DbContext能够动态添加DbSet么,第1张

using System

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中也是可以的如下展开


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11266956.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-14
下一篇 2023-05-14

发表评论

登录后才能评论

评论列表(0条)

保存