如何修改其他程序集中已映射实体的映射

本文关键字:映射 集中 程序集 程序 实体 其他 何修改 修改 | 更新日期: 2023-09-27 18:24:52

我想为EF 中的实体自定义映射

例如,我有一个实体:

public class User
{  
    public int UserId { get;set;}
    public string Firstname { get;set;}
    public string ColA {get; set;}
    public string ColB {get; set;}
}

它已经在EF中的OnModelCreating()中添加了常用的映射。如果我在两个独立的程序集中有两个函数,请调用AssemblyA.dll和AssemblyB.dll,它们由MEF框架动态加载。

AssemblyA.dll只需要ColA,必须删除ColB,AssemblyB.dll反之亦然,所以我需要为这两个服务定义两个新的映射类,它将根据其程序集动态运行以删除列(AssemblyA将忽略ColB,而AssemblyB将忽略ColA)。我不想修改当前EF的代码,因为它已经在生产中了。每个程序集的所有更改都应在其自己的程序集中。

英孚支持我们这样做吗?或者你能给我一个方向吗。

如何修改其他程序集中已映射实体的映射

不太清楚你想做什么,但:

  • 每个EF上下文的每个表和实体只能映射一次
  • 这意味着,如果加载AssemblyA的配置,则不能使用AssemblyB的配置
  • 这也意味着您不能使用默认方式在OnModelCreating中构造EF映射,因为该方法在整个应用程序生命周期中通常只调用一次
  • 您可以手动构造两个DbModel容器,将它们编译为DbCompiledModel并将它们传递给DbContext构造函数-这将允许您为AssemblyA和AssemblyB提供两种不同的映射配置,但永远不会在同一上下文实例中同时拥有这两种配置
  • EF迁移很可能不起作用,因为它们期望每个数据库只有一个映射集

无论如何,如果您使用的是MEF和模块化架构,则每个实体都应该是核心(与任何特定模块无关,并在模块之间按原样共享)或模块(不被任何其他模块或核心使用)。