如何在Entity Framework中映射基本实体属性?

时间:2009-11-24 13:39:51

标签: entity-framework

我正在建立一个实体模型,其中我有大多数其他实体的公共基础实体。例如:

人 - > BaseEntity

BaseEntity ID 创建 等...

人 名字 姓 等...

在相应的存储表中,所有列都在Person表中。

人 ID 创建 名字 姓 等...

当我在Person实体中映射实体属性时,我想将Person表中的Id列映射到EntityBase中的Id属性,将FirsName列映射到FirstName实体属性。

但是,当您在Person实体上并添加Person表进行映射时,您只能映射Person实体中的属性而不是继承类中的属性?

我是否在概念上设置错误了?

由于

2 个答案:

答案 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为您生成它们。

希望这有帮助

亚历