实体框架DbContext映射属性基于鉴别器列和id

时间:2012-11-28 20:14:47

标签: c# entity-framework entity-framework-5 dbcontext

背景
我正在开发一个采用插件架构设计的系统,允许多个数据存储(SQL Server,Firebird,MySQL)。

这个插件架构相当复杂,似乎是尝试从头开始编写ADO.NET。随着时间的推移,插件'已删除使用SQL Server以外的数据库的功能。我正在考虑将此项目的数据访问部分从遗留框架转换为Entity Framework 5.0 DbContext。 我尝试不修改数据库以避免现有客户的数据转换。

我有使用Fluent NHibernate的经验,并且我试图找出使用EF DbContext的Fluent API来解决我当前项目目标的最佳方法。我知道Fluent API通常用于Code-First开发,但出于维护原因,我想在这种情况下使用它。

问题
我有很多包含ParentTableParentId列的表格。 ParentTable是short,ParentId是int(不确定是否重要)。

我有一个抽象的基础对象,当前只有Id的Int32属性。

我想要做的是定义要映射到ParentTable属性的枚举,并让这些父对象基于ParentTable枚举鉴别器返回基础对象的实例。在EF DbContext中执行此操作的最佳方法是什么?如果我需要某种名为GetParent的扩展方法或存储库方法,我可以这样做,但我希望尽可能通过EF的映射自动完成。<\ n / p>

这是一个例子(不,我还没有创建表关联的枚举):

public class Person : BaseObject, IHasParentProperties
{
    // ... removed other properties
    public short ParentTable { get; internal set; }
    public int ParentId { get; internal set; }

    [NotMapped]
    public BaseObject Parent { get; set; }
}

假设ParentTable对象中的Person是一个短片,其映射到TableMapping.Client的未来枚举值且ParentId333,是否可以根据表鉴别器 id配置映射以将Parent加载为Client对象?总是只有一个父级,但父级可以是十个不同对象中的任何一个。

在流利的NHibernate中,如果我没记错的话,我已经完成了同样的任务,其中包括一些参考识别器的变体(取自here):

ReferencesAny(x => x.Author)
  .EntityTypeColumn("Type")
  .EntityIdentifierColumn("Id")
  .IdentityType<int>();

已经有一段时间了,但我记得这段经历与我目前使用EF的经历不相上下。

我喜欢将数据库规范化并从头开始重写大部分数据库,但我试图让所有内容尽可能简单。

感谢。

0 个答案:

没有答案