实体框架核心 - 多个DbContext单个数据库

时间:2018-04-25 07:33:38

标签: c# wpf entity-framework entity-framework-core dbcontext

我有一个wpf app + EF Core 2来访问数据(db中的几个表) 该软件计划为2或3个不同的“版本”(取决于业务,但将与不同的视图共享相同的数据库和“相同的ui”)。 今天svn mv包含很多表格(涵盖所有版​​本),我希望将这个表格分成许多小DbContext

那么最好的方法是什么? 我会Dbcontext(s)根据版本类型(在启动用户界面时由用户设置)解析DI /IOC(返回CurrentContextDBVersion1DBVersion2 下面的代码是好方法吗?

DBVersion3
  • 如何在public class DBVersion1 : DbContext { public DbSet<Blog> Blogs { get; set; } public DbSet<Post> Posts { get; set; } public DBSet<User>{ get; set; } public DBSet<Books> { get; set; } public DBSet<Engine> { get; set; } } public class DBVersion2 : DbContext { public DbSet<Blog> Blogs { get; set; } public DbSet<Post> Posts { get; set; } public DBSet<User>{ get; set; } public DBSet<Books> { get; set; } public DBSet<Engine> { get; set; } public DBSet<Paiement>{ get; set; } public DBSet<Invoice> { get; set; } } public class DBVersion3 : DbContext { public DbSet<Blog> Blogs { get; set; } public DbSet<Post> Posts { get; set; } } public static DbContext CurrentContext { get { var _servicesCollection = new ServiceCollection(). AddDbContext<DBVersion1 >(options => options.UseSqlServer(@"Server= (localdb)\mssqllocaldb;Database=EFGetStarted.ConsoleApp.NewDb;Trusted_Connection=True;")) .AddDbContext<DBVersion2 >(options => options.UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=EFGetStarted.ConsoleApp.NewDb;Trusted_Connection=True;")) .AddDbContext<DBVersion3>(options => options.UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=EFGetStarted.ConsoleApp.NewDb;Trusted_Connection=True;")) .BuildServiceProvider(); return _mainContext ?? (_mainContext = _servicesCollection.GetService<DBVersion1>()); } } Dbcontext1/2/3中的CurrentContext之间切换?
  • 重构实际可能很难?即今天视图模型可以有 getter et

之后:     var v = DBContext.Paiement....? =&GT;在版本1的情况下不编译? (或者在这种情况下可能没有意义?)

由于

2 个答案:

答案 0 :(得分:1)

  

&#34;我想将这个小片分成许多Dbcontext(s)&#34;

这可能不是解决您如何做到这一点的问题的答案,因为我不相信拆分数据库上下文是一种很好的做法。

您的数据库上下文代表数据库。整个数据库,而不是它的一部分。如果你拆分它,你很可能会遇到严重的问题。例如,您使用上下文的版本1更新某些内容,而上下文的版本2仍然具有要缓存的旧数据。

我也非常担心你在这种分离时会引入的维护噩梦。毕竟,你现在必须维护多个数据库上下文,并且每个上下文都可能共享一些部分。

所以主要的问题是:你为什么要那样做?有什么好处?如果你看一下风险,它是否值得?

在我看来,更好的解决方案是拥有1个DB上下文,并在其上进行分割,例如,在域层(有界上下文)中。然后你有一个逻辑分离而不是物理分离,这更有意义。

如果您真的想要进行物理拆分,那么也要拆分数据库本身。但是,在密钥之间存在引用一致性,你会引入像这样的复杂性......

希望这会对你有所帮助。

答案 1 :(得分:0)

您可以为YourDbContext(DbContext)课程使用分部课程。 Partial Class 您可以使用单个YourDbContext(DbContext)类,但它们将部分用不同的文件实现,最后您可以解析此DbContextin DI / IOC。在您的存储库模式中,您只能调用YourDbContext(DbContext),不需要多个DbContext,否则它将违反设计原则/代码标准。

DBVersion1.cs文件

public partial class YourDbContext{
     public DbSet<Blog> Blogs { get; set; }  
     public DbSet<Post> Posts { get; set; }
     public DBSet<User>{ get; set; }
     public DBSet<Books> { get; set; }
     public DBSet<Engine> { get; set; }
}

DBVersion2.cs文件

public partial class YourDbContext{
     public DbSet<Blog> Blogs { get; set; }  
     public DbSet<Post> Posts { get; set; }
     public DBSet<User>{ get; set; }
     public DBSet<Books> { get; set; }
     public DBSet<Engine> { get; set; }
     public DBSet<Paiement>{ get; set; }
     public DBSet<Invoice> { get; set; }
}

<强> Startup.cs

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<YourDbContext>(options =>
        options.UseSqlServer(Configuration.GetConnectionString("Cn")));
}

你可以看到我的tackoverflow answer,如何在asp.ner core 2中设置EFcore