namespace Core { public class BaseContext : DbContext { DBSet<SomeCoreEntity> CoreEntities {get;set;} } }
然后有
namespace Web { public class DerivedContext : Core.BaseContext { DBSet<SomeNewEntity> NewEntities {get;set;} } }
从这里开始,我希望核心能够拥有
baseContextInstance.CoreEntities
和
derivedContextInstance.CoreEntites
引用相同的表,但派生的上下文也可以访问NewEntites.这样做的正确方法是什么?它是否需要web.config中的特殊内容,可能是DatabaseInitializerForType?我环顾四周,找不到任何关于如何做到这一点的好文档.
解决方法
注意:我正在使用包管理器中的update-database和Enable-Migrations命令.其他部署过程的一般原则应该是相同的,但我还没有测试过.
首先,创建基本上下文(以及关联的DbSet类):
namespace Core { public partial class BaseContext : DbContext { public BaseContext() { } public BaseContext(string connectionString) : base(connectionString) { } public DbSet<SystemUser> SystemUser { get; set; } } public partial class SystemUser { [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] public int Id { get; set; } public string Forename { get; set; } public string Surname { get; set; } } }
接下来,创建派生上下文(使用新类):
namespace Web { public class DerivedContext : Core.BaseContext { public DerivedContext() : base("BaseContext") { } public DbSet<Order> Order { get; set; } } public class Order { public int Id { get; set; } public double Quantity { get; set; } public string Item { get; set; } } }
到目前为止,这几乎就是你所做的事情但是,请注意两件事:
> BaseContext公开一个带有连接字符串(或连接字符串键名)的构造函数 – 它传递给DbContext中的相同构造函数
>派生上下文将键名“BaseContext”传递给BaseContext
现在,将连接字符串条目添加到Web项目中的.config文件中,使用键名BaseContext和相应的连接字符串.
<connectionStrings> <add name="BaseContext" connectionString="Data Source=.;Initial Catalog=TestDb;Integrated Security=sspI;" providerName="System.Data.sqlClient" /> </connectionStrings>
通过在Package Manager控制台中输入以下内容,将迁移添加到Web项目(确保从下拉列表中选择了Web项目):
Enable-Migrations
输入创建的迁移文件,并在构造函数中将AutomaticMigrations更改为true
public Configuration() { AutomaticMigrationsEnabled = true; }
现在,当您从Web项目发布时,在PM控制台中使用以下内容:
Update-Database
它会将SystemUser和Order发布到一个新的DB(在我的例子中称为TestDb).
用法:
如果检查数据库,您会注意到它已成功创建了SystemUsers和Orders表.
如果您从应用程序运行以下代码:
using (var ctxt = new Core.BaseContext()) { var user1 = new Core.SystemUser() { Forename = "Obsidian",Surname = "Phoenix" }; ctxt.SystemUser.Add(user1); ctxt.SaveChanges(); } using (var ctxt = new DerivedContext()) { var user2 = new Core.SystemUser() { Forename = "John",Surname = "Doe" }; ctxt.SystemUser.Add(user2); ctxt.SaveChanges(); var users = ctxt.SystemUser.ToList(); users.ForEach(u => Debug.WriteLine(string.Format("{0} {1}",u.Forename,u.Surname))); var order = new Order() { Id = 1,Item = "Test Item",Quantity = 1 }; ctxt.Orders.Add(order); ctxt.SaveChanges(); }
您可以看到我可以使用BaseContext和DerivedContext来读取/写入Systemuser,我可以使用DerivedContext来读取/写入Order.