EF 5 Code First首先在类中使用继承

时间:2013-07-15 18:32:47

标签: entity-framework

尝试运行此代码时出现错误。

  

无法确定之间关联的主要结束   类型'AddressBook.DAL.Models.User'和'AddressBook.DAL.Models.User'。   必须明确配置此关联的主要结尾   使用关系流畅的API或数据注释。

目标是我创建的baseClass具有所有表的公共字段。

如果我不使用基类,一切正常。

namespace AddressBook.DAL.Models
{
public class BaseTable
{
    [Required]
    public DateTime DateCreated { get; set; }
    [Required]
    public DateTime DateLastUpdatedOn { get; set; }

    [Required]
    public virtual int CreatedByUserId { get; set; }

    [ForeignKey("CreatedByUserId")]
    public virtual User CreatedByUser { get; set; }

    [Required]
    public virtual int UpdatedByUserId { get; set; }

    [ForeignKey("UpdatedByUserId")]
    public virtual User UpdatedByUser { get; set; }

    [Required]
    public RowStatus RowStatus { get; set; }

}

public enum RowStatus
{
    NewlyCreated,
    Modified,
    Deleted
}


}




namespace AddressBook.DAL.Models
{
public class User : BaseTable
{
    [Key]
    public int UserID { get; set; }
    public string UserName { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string MiddleName { get; set; }
    public string Password { get; set; }

}

}

1 个答案:

答案 0 :(得分:0)

您需要向EF提供映射信息。以下文章描述了不同EF实体继承模型的代码优先策略(每个类型的表,每个层次的表等)。并非所有场景都直接与您在此处所做的相同,但请注意映射代码,因为这是您需要考虑的事项(如果您想在其他场景中使用继承,那么这是很好的信息)。请注意,在涉及ORM时,继承确实存在限制和成本,特别是对于多态关联(这使得TPC场景有些难以管理)。 http://weblogs.asp.net/manavi/archive/2010/12/24/inheritance-mapping-strategies-with-entity-framework-code-first-ctp5-part-1-table-per-hierarchy-tph.aspx

EF可以处理这种情况的另一种方法是将复杂类型聚合成“假的”组合关系。换句话说,即使您的审计字段是某个事务实体表的一部分,您也可以将它们拆分为一个公共复杂类型,该类型可以与包含这些相同字段的任何其他实体相关联。这里的区别在于您实际上将这些字段封装到另一种类型中。例如,如果您将审计字段移动到“审计”补全文本类型,您将具有以下内容: User.Audit.DateCreated 代替 User.DateCreated

在任何情况下,您仍需要提供适当的映射信息。 这篇文章解释了如何执行此操作:http://weblogs.asp.net/manavi/archive/2010/12/11/entity-association-mapping-with-code-first-part-1-one-to-one-associations.aspx