我可以将2个不同的EntityFramework上下文共享一个SqlServer Compact数据库吗?

我有一个包含2个表的SqlServer Compact Edition数据库。

对于这些表中的每一个,我都有一个派生自DbContext的上下文类,应用程序使用它来访问该表。

为了保持应用程序的不同组件分离,我不能有一个上下文类,它将具有两个表的DbSet属性。 相反,我需要有两个不同的上下文类,每个上下文必须完全不知道另一个及其数据。

我正在使用代码优先方法,我的代码定义了实体和模型,我让Entity Framework为我创建数据库。

我的问题是:我怎样才能让Entity Framework在上下文初始化时自动为我创建数据库和表,但仍然有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结构检查模型类才能正常工作(它们必须“同步”)。

为了保持应用程序的不同组件分离,我不能有一个上下文类,它将具有两个表的DbSet属性。 相反,我需要有两个不同的上下文类,每个上下文必须完全不知道另一个及其数据。

如果booth表之间没有连接,并且要求应用程序将这些表完全分开,那么为什么不创建两个数据库并为每个数据库创建一个上下文?

根本,我会使用一个数据库,有一个内部DbContext和两个不同的公共存储库类,它们封装了对这两个表的访问。 如果所有代码都在同一个程序集中,则可以从存储库类访问内部上下文。 需要访问存储库的人可以访问他需要的表的存储库。

是的,您可以使用多个DB上下文指向同一个DB。

来自Entity Framework团队的Arthur Vickers推荐以下模式……

不要在app.config文件中为多个上下文指定单独的连接字符串,只需设置一个字符串并为其指定通用名称即可。

     

然后创建一个将使用连接字符串的基本上下文类:

 using System.Data.Entity; namespace DataLayer { public class BaseContext : DbContext where TContext : DbContext { static BaseContext() { Database.SetInitializer(null); } protected BaseContext() : base("name=MyDBContext") { } } } 

现在,在每个上下文中inheritance此基本行为(例如):

 namespace DataLayer.Models { public class OrderContext : BaseContext … namespace DataLayer.Models { public class ProductContext : BaseContext