我可以有2个不同的实体框架上下文共享一个单一的SqlServer紧凑数据库
本文关键字:单一 一个 SqlServer 数据库 共享 2个 实体 我可以 上下文 框架 | 更新日期: 2023-09-27 18:13:56
我有一个包含2个表的SqlServer精简版数据库。
对于每个表,我都有一个从DbContext
派生的上下文类,应用程序使用它来访问表。
为了保持应用程序的不同组件解耦,我不能让一个上下文类对两个表都具有DbSet
属性。相反,我需要有两个不同的上下文类,它们中的每一个都必须完全不知道另一个及其数据。
我使用代码优先的方法,我的代码定义实体和模型,我让实体框架为我创建数据库。
我的问题是:我怎么能让实体框架创建数据库和表自动为我在上下文初始化,但仍然有2上下文共享相同的数据库和连接?
现在我得到的是,第一个上下文成功地创建了数据库和其中的表,但是当我试图创建第二个上下文时,我得到的,不出所料如下错误:
The model backing the 'SomeObjectContext' context has changed since the database
was created. Either manually delete/update the database, or call Database.SetInitializer
with an IDatabaseInitializer instance. For example, the DropCreateDatabaseIfModelChanges
strategy will automatically delete and recreate the database, and optionally seed it with
new data.
所有可用的IDatabaseInitializer
都不适合我,因为我不希望在创建第二个上下文时删除整个数据库。我只是想在现有的数据库中创建第二个上下文的表。
如果有任何建议可以解决这个问题,我将不胜感激。
谢谢
您不能仅对一个数据库使用CodeFirst。CodeFirst必须根据db结构检查模型类以正常工作(它们必须"同步")。
为了保持应用程序的不同组件去耦,我不能有一个context类会有DbSet属性。相反,我需要两个不同的上下文类,它们中的每一个都必须完全不知道另一个和它的数据。
如果两个表之间没有连接,并且应用程序需要将这些表完全分开,为什么不创建两个数据库并为每个表创建一个上下文呢?
总之,我将使用一个数据库,具有一个内部DbContext
和两个不同的公共存储库类,它们封装对两个表的访问。如果所有代码都在同一程序集中,则可以从存储库类访问内部上下文。需要访问存储库的人可以访问他所需要的表的存储库。
是的,您可以使用多个DB上下文指向同一个DB。
实体框架团队的Arthur Vickers推荐以下模式....
不要在app.config文件中为多个上下文指定单独的连接字符串,只需设置一个字符串并给它一个通用名称。
<connectionStrings>
<add name="MyDBContext" connectionString="Your conn string here" providerName="System.Data.SqlClient" />
</connectionStrings>
然后创建一个基上下文类,它将使用连接字符串:
using System.Data.Entity;
namespace DataLayer
{
public class BaseContext<TContext> : DbContext where TContext : DbContext
{
static BaseContext()
{
Database.SetInitializer<TContext>(null);
}
protected BaseContext()
: base("name=MyDBContext")
{
}
}
}
现在,在每个上下文中继承这个基本行为(例如):
namespace DataLayer.Models
{
public class OrderContext : BaseContext<OrderContext>
…
namespace DataLayer.Models
{
public class ProductContext : BaseContext<ProductContext>
…