我可以将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 …