我有一个wpf app + EF Core 2来访问数据(db中的几个表)
该软件计划为2或3个不同的“版本”(取决于业务,但将与不同的视图共享相同的数据库和“相同的ui”)。
今天svn mv
包含很多表格(涵盖所有版本),我希望将这个表格分成许多小DbContext
那么最好的方法是什么?
我会Dbcontext(s)
根据版本类型(在启动用户界面时由用户设置)解析DI /IOC
(返回CurrentContext
或DBVersion1
或DBVersion2
下面的代码是好方法吗?
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的情况下不编译? (或者在这种情况下可能没有意义?)
由于
答案 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