因此,如果您确保 Derived 和 base 上下文本质上使用相同的 ConnectionString 键,那么它看起来是可能的。您可以让他们使用不同的密钥,但这只会导致您需要维护的重复。
注意:我正在使用来自包管理器的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>
通过在包管理器控制台中输入以下内容来向 Web 项目添加迁移(确保从下拉列表中选择了 Web 项目):
Enable-Migrations
输入创建的Migration文件,在构造函数中将AutomaticMigrations改为true
public Configuration()
{
AutomaticMigrationsEnabled = true;
}
现在,当您从 Web 项目发布时,在 PM 控制台中使用以下内容:
Update-Database
它将SystemUser 和Order 发布到新数据库(在我的示例中称为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读/写@ 987654342@.