覆盖 DLL 中的 DataModel

Sor*_*ora 5 c# asp.net asp.net-mvc content-management-system edmx

我有一个我正在处理的新 MVC 项目,它基本上是一个我打算在其他项目中使用的 CMS,结构如下

在此处输入图片说明

假设我创建了一个使用我的 CMS 的 DLL 的新项目,尽管客户端需要根据附加条件向模型添加新表,但覆盖 EcomerceModel.edmx 的最佳方法是什么,以便我可以使用新表添加了表,而不会触及新创建的项目中的原始 Dll。

谢谢,

小智 1

好吧,有一个快速的解决方案,即将您的Data项目分成几个项目,以保持最低要求。

因此,如果我们以您的Data项目为例,它将分为几个类库,例如:

  • Data.Models(仅包含用于抽象目的的数据模型)。
  • Data.Core(这是主要的数据项目)。
  • 数据.Common(可选)
  • 数据助手(可选)

为了使其发挥作用,您需要切换到Code First方法,以确保您可以控制迁移和模型。(您不需要每次更新模型时 EF 都覆盖您的自定义设置,而且您需要将更新保留在代码中而不是数据库中)。

建议将模型保留在单独的程序集中,以便在其他项目中重用,而无需引用完整的数据层。

之后,Data.Core您将需要在您的应用程序中引用所有其他Data.*类库。然后,你可以DbContext像这样创建你的:

public class ECommerceDbContext : DbContext 
{
    public DbSet<Admin> Admins { get; set; }
    
    /// rest of Entities 
    

    protected override void OnModelCreating(ModelBuilder builder)
    {
        base.OnModelCreating(builder);
        
        // your Entities configurations 
    }   
}
Run Code Online (Sandbox Code Playgroud)

现在,您的Data图层已设置完毕并准备好在其他项目中引用。

在您想要重用当前的其他项目中,Data.Core您需要引用Data.Core(通过项目引用或 Nuget)。ECommerceDbContext然后,创建一个继承并扩展它的新类。就像是 :

public class ECommerceCMSContext : ECommerceDbContext 
{
    /// New Entities 
    

    protected override void OnModelCreating(ModelBuilder builder)
    {
        base.OnModelCreating(builder);
        
        // New Entities configurations 
    }   
}
Run Code Online (Sandbox Code Playgroud)

现在,将ECommerceCMSContext任何新表添加到当前上下文中。

PS您可以看看ASP.NET Core Identity他们正在使用类似的实现,这对您的工作非常有帮助。