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

假设我创建了一个使用CMS的DLLs的新项目,尽管客户端需要根据附加标准向模型添加一个新表,但重写EcomerceModel.edmx的最佳方法是什么,这样我就可以使用新添加的表,而无需接触新创建的项目的原始Dlls。
谢谢,
发布于 2021-02-05 14:39:51
对此,有一个快速的解决方案,就是将Data项目划分为几个项目,以使其保持在最低要求。
因此,如果我们以您的Data项目为例,它将被分成几个类库,如下所示:
purposes).
)。
为此,您需要切换到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
}
}现在,您的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
}
}现在,使用ECommerceCMSContext将任何新表添加到当前上下文中。
您可以看看他们使用的ASP.NET Core Identity类似的实现,这对您的工作非常有帮助。
发布于 2021-02-03 06:48:26
你的问题不是一个简单的回答。您要求在编程级别上进行数据映射,并且取决于您希望克服/处理的更改将决定答案必须有多复杂。这也可以看作是模型继承。
首先,edmx文件对于您想要做的事情是无用的。它将业务模型与数据模型相结合,这意味着对数据或业务模型的任何更改都会导致文件中断。
下面这两个选项将需要大量的工作,并应被认为是一个全新的应用程序的规模。
元数据解决方案
您可能需要考虑在代码中创建元数据/数据层,并使用它来更改数据库的外观。
而不是通过ecommerce.edmx访问模型--通过单独的业务/数据层访问它。然后,数据层可以使用动态调用或使用外部首选项文件来保存sql访问来创建数据访问/ sql。
例如,在数据库中创建外部文件、表或代码中的资源,其中包含描述要使用的表的元数据。一个非常简单的解决方案可能如下所示:
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
弱点:
需要很长时间。
反射溶液
另一种方法是将数据层存储在单独的程序集中,并使用接口引用它。
新的应用程序所需要做的就是用它们来替换数据层。
即
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
弱点:
。
工作围绕着
如果修改非常简单,您可以编写一个解析器来编辑edmx文件中的映射数据。不建议,因为这可能导致不稳定。
另一项工作可能包括使用数据库视图隐藏更改,以及将数据更改处理移动到数据库。因此,保持旧的edmx文件查看视图和新的edmx文件的展开设计,看看展开的表。
周围的工作就是..。除了最琐碎的改变之外,它们可能会比它们对所有人的价值更大。
如果您想做一些研究,请看一看使用以下术语的文章
面向对象的Concepts
很好的狩猎!
https://stackoverflow.com/questions/65938243
复制相似问题