我正在建立一个实体模型,其中我有大多数其他实体的公共基础实体。例如:
人 - > BaseEntity
BaseEntity ID 创建 等...
人 名字 姓 等...
在相应的存储表中,所有列都在Person表中。
人 ID 创建 名字 姓 等...
当我在Person实体中映射实体属性时,我想将Person表中的Id列映射到EntityBase中的Id属性,将FirsName列映射到FirstName实体属性。
但是,当您在Person实体上并添加Person表进行映射时,您只能映射Person实体中的属性而不是继承类中的属性?
我是否在概念上设置错误了?
由于
答案 0 :(得分:1)
我认为你想要做的事情在EF中是不可能的。也许我错了。我通过定义接口来实现公共属性:
public interface ICreationInfo
{
DateTime CreationDate { get; set; }
User CreatedBy { get; set; }
EntityReference<User> CreatedByReference { get; set; }
}
public interface ILastModificationInfo
{
DateTime LastModificationDate { get; set; }
User LastModificationBy { get; set; }
EntityReference<User> LastModificationByReference { get; set; }
}
然后我定义了T4模板,让它在每个实体类中都有:
<#@ template language="C#" #>
<#@ output extension="cs" #>
<#@ import namespace="System.Collections.Generic" #>
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Web;
<#
String[] classNames = new String[] {"User","Project","Group","GroupUser","OperationSystem","TaskType","Priority","Severity","Status","Version","Platform","Task","TaskUser","Attachment","Comment","Setting","CustomField"};
List<String> classWithoutModificationInfo = new List<String>();
classWithoutModificationInfo.Add("GroupUser");
classWithoutModificationInfo.Add("TaskUser");
classWithoutModificationInfo.Add("Attachment");
#>
namespace CamelTrap.Models
{
<# foreach(String className in classNames) { #>
public partial class <#= className #> : IBasicEntityInfo, ICreationInfo <#= (!classWithoutModificationInfo.Contains(className))?",ILastModificationInfo":"" #>
{
}
<# } #>
}
这会生成代码:
public partial class User : IBasicEntityInfo, ICreationInfo, ILastModificationInfo
{
}
public partial class Project : IBasicEntityInfo, ICreationInfo, ILastModificationInfo
{
}
public partial class Group : IBasicEntityInfo, ICreationInfo, ILastModificationInfo
{
}
当我想访问基本属性时,我会检查界面。
答案 1 :(得分:1)
这里的关键是在概念模型中有一个不是实体的基类。
EF 1.0(3.5 SP1)或EF 4.0 Beta 2不支持此方法。
但是在EF 4.0 RTM中你可以选择这样的课程:
public class Base
{
public DateTime CreatedDate{get;set;}
}
public class Derived:Base
{
public string SomeProperty {get;set;}
}
并将'Derived'类映射到Conceptual模型中的实体(随机组成的实体DSL!):
entity Derived{
DateTime CreateDate;
string SomeProperty;
}
要做到这一点,您需要自己编写类(使用POCO或仅代码),而不是让EF为您生成它们。
希望这有帮助
亚历