尝试运行此代码时出现错误。
无法确定之间关联的主要结束 类型'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; }
}
}
答案 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