0

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

无法确定类型“AddressBook.DAL.Models.User”和“AddressBook.DAL.Models.User”之间关联的主体端。此关联的主体端必须使用关系流式 API 或数据注释显式配置。

目标是我正在创建具有所有表的公共字段的基类。

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

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; }

}

}
4

1 回答 1

0

您需要向 EF 提供映射信息。下面的文章描述了不同 EF 实体继承模型(table-per-type、table-per-hierarchy 等)的代码优先策略。并非所有场景都是您在此处直接执行的操作,但请注意映射代码,因为这是您需要考虑的(如果您想将继承用于其他场景,这是一个很好的信息)。请注意,对于 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

于 2013-07-15T19:02:34.857 回答