我可以有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都不适合我,因为我不希望在创建第二个上下文时删除整个数据库。我只是想在现有的数据库中创建第二个上下文的表。

如果有任何建议可以解决这个问题,我将不胜感激。

谢谢

我可以有2个不同的实体框架上下文共享一个单一的SqlServer紧凑数据库

您不能仅对一个数据库使用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>
    …
相关文章: