背景
我正在开发一个系统,该系统采用插件架构设计以允许多个数据存储(SQL Server、Firebird、MySQL)。
这个插件架构相当复杂,似乎是从头开始编写 ADO.NET 的尝试。随着时间的推移,使用 SQL Server 以外的数据库的“插件”功能已被删除。我正在考虑将这个项目的数据访问部分从遗留框架转换为 Entity Framework 5.0 DbContext。我试图不修改数据库以避免现有客户的数据转换。
我有使用 Fluent NHibernate 的经验,我正在尝试找出使用 EF DbContext 的 Fluent API 来解决我当前项目目标的最佳方法。我知道 Fluent API 通常用于 Code-First 开发,但出于维护原因,我想在这种情况下使用它。
问题
我有很多表,其中包含一个ParentTable
和ParentId
列。ParentTable 是一个short
并且 ParentId 是一个int
(不确定是否重要)。
我有一个抽象的基础对象,它当前只有一个 Int32 属性Id
。
我想做的是定义一个要映射到ParentTable
属性的枚举,并让这些具有父对象的对象基于ParentTable
枚举鉴别器返回一个基本对象的实例。在 EF DbContext 中执行此操作的最佳方法是什么?如果我需要调用某种扩展方法或存储库方法GetParent
,我可以接受,但如果可能的话,我宁愿让 EF 的映射自动完成。
这是一个示例(不,我还没有为表关联创建枚举):
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
对象中是一个映射到 和 的未来枚举值的short TableMapping.Client
,ParentId
是否333
可以将映射配置为基于表鉴别器和idParent
作为对象加载?总是只有一个父对象,但父对象可以是十个不同对象中的任何一个。Client
在 Fluent NHibernate 中,如果我没记错的话,我已经通过引用鉴别器的一些变体完成了同样的任务(取自这里):
ReferencesAny(x => x.Author)
.EntityTypeColumn("Type")
.EntityIdentifierColumn("Id")
.IdentityType<int>();
已经有一段时间了,但我记得这种体验与我目前使用 EF 的体验相当。
我很想规范化数据库并从头开始重写大部分内容,但我正在努力使一切尽可能简单。
谢谢。