首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在DLL中重写DataModel

在DLL中重写DataModel
EN

Stack Overflow用户
提问于 2021-01-28 13:39:46
回答 2查看 200关注 0票数 5

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

假设我创建了一个使用CMS的DLLs的新项目,尽管客户端需要根据附加标准向模型添加一个新表,但重写EcomerceModel.edmx的最佳方法是什么,这样我就可以使用新添加的表,而无需接触新创建的项目的原始Dlls。

谢谢,

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-02-05 14:39:51

对此,有一个快速的解决方案,就是将Data项目划分为几个项目,以使其保持在最低要求。

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

purposes).

  • Data.Core (它是主要的数据project).

  • Data.Common (Optional)

  • Data.Helpers (可选)

)。

为此,您需要切换到Code First方法,以确保您能够控制您的迁移和模型。(您不需要EF在每次更新模型时覆盖您的自定义,而且您还需要将更新保存在代码中而不是数据库中)。

建议将您的模型保持在单独的组装中,以便在其他项目中重用,而不需要引用完整的数据层。

之后,在您的Data.Core中,您需要将所有其他Data.*类库引用到它。然后,您可以这样创建您的DbContext

代码语言:javascript
复制
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 
    }   
}

现在,您的Data层已经设置好,可以在其他项目中引用。

在要重用当前Data.Core的其他项目中,需要引用Data.Core (通过项目引用或Nuget)。然后,创建一个继承ECommerceDbContext的新类,该类将对其进行扩展。类似于:

代码语言:javascript
复制
public class ECommerceCMSContext : ECommerceDbContext 
{
    /// New Entities 
    

    protected override void OnModelCreating(ModelBuilder builder)
    {
        base.OnModelCreating(builder);
        
        // New Entities configurations 
    }   
}

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

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

票数 1
EN

Stack Overflow用户

发布于 2021-02-03 06:48:26

你的问题不是一个简单的回答。您要求在编程级别上进行数据映射,并且取决于您希望克服/处理的更改将决定答案必须有多复杂。这也可以看作是模型继承。

首先,edmx文件对于您想要做的事情是无用的。它将业务模型与数据模型相结合,这意味着对数据或业务模型的任何更改都会导致文件中断。

下面这两个选项将需要大量的工作,并应被认为是一个全新的应用程序的规模。

元数据解决方案

您可能需要考虑在代码中创建元数据/数据层,并使用它来更改数据库的外观。

而不是通过ecommerce.edmx访问模型--通过单独的业务/数据层访问它。然后,数据层可以使用动态调用或使用外部首选项文件来保存sql访问来创建数据访问/ sql。

例如,在数据库中创建外部文件、表或代码中的资源,其中包含描述要使用的表的元数据。一个非常简单的解决方案可能如下所示:

代码语言:javascript
复制
MetaTables (id, myTableName, derivedTableName)
    Order, "Order", "UserOrder"
    Customer, "Customer", "UserCustomer"

MetaAttributes (tableId, id, myAttrName, myAttrType, derivedAttrName, derivedType, etc)
    Order, Id, "Id", int, "UserId", guid
    Order, Description, "Description", string, "UserDescription", string
    Customer, Id, "Id", int, "UserId", guid

MetaRelations ()
    etc

然后使用它动态地创建查询。如果您这样做,其他人可以使用您的代码,只需要更新您的元数据文件与新的映射。只要它们不添加新的强制列。

优势:

如果required

  • Version独立的话,
  • 可以快速地与任何新的数据结构一起工作,
  • 数据结构可以动态地改变。

弱点:

  • 动态创建的查询可能非常慢
  • 实现动态数据层

需要很长时间。

反射溶液

另一种方法是将数据层存储在单独的程序集中,并使用接口引用它。

新的应用程序所需要做的就是用它们来替换数据层。

代码语言:javascript
复制
public interface IDataLayer
{
    public List<IOrder> GetOrderList()
}

// MyDLL1
public class DataLayerImplementationA: IDataLayer
{
    public List<IOrder> GetOrderList()
    {
        // get data from database X, return results
    }
}

// MyDLL2
public class DataLayerImplementationB: IDataLayer
{
    public List<IOrder> GetOrderList()
    {
        // get data from database B, return results
    }
}

优势:

database

  • Fastest implementation

  • Compile

  • 代码用于新的

  • 时间检查!

弱点:

  • 需要使用新编译的DLL
  • 多个DLL
  • 来覆盖程序集,即使是一个小的更改也可能需要程序员编写大量代码(或至少剪切和粘贴)

工作围绕着

如果修改非常简单,您可以编写一个解析器来编辑edmx文件中的映射数据。不建议,因为这可能导致不稳定。

另一项工作可能包括使用数据库视图隐藏更改,以及将数据更改处理移动到数据库。因此,保持旧的edmx文件查看视图和新的edmx文件的展开设计,看看展开的表。

周围的工作就是..。除了最琐碎的改变之外,它们可能会比它们对所有人的价值更大。

如果您想做一些研究,请看一看使用以下术语的文章

面向对象的Concepts

  • Abstract数据层

  • 模型inheritance

  • Model控制器视图

很好的狩猎!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65938243

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档