【问题标题】:How to modify mapping for already mapped entities in other assemblies?如何修改其他程序集中已映射实体的映射?
【发布时间】:2012-02-17 09:27:53
【问题描述】:

我想为 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() 中已经添加了映射。如果我在 2 个单独的程序集中有 2 个函数,请调用 AssemblyA.dll 和 AssemblyB.dll,它们由 MEF 框架动态加载。

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

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

【问题讨论】:

  • 不确定我是否理解您所说的映射是什么意思。你能包括你的OnModelCreating()代码吗?

标签: c# entity-framework entity-framework-migrations


【解决方案1】:

不是很清楚你要做什么,但是:

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

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

【讨论】:

  • 谢谢拉迪斯拉夫,你能给我更多关于第 3 项的信息吗(你告诉我使用 DbCompileModel)?另外,有什么方法可以实现我上面的想法吗?
猜你喜欢
  • 2015-10-03
  • 2011-07-13
  • 2012-05-25
  • 2013-08-18
  • 2015-07-13
  • 2019-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多