首先,我知道有很多关于Unable to determine the principal end of an association between the types
错误的帖子,但我看到的单个帖子与我的问题不符,如果我错过了一个抱歉。
我已经构建了一个实体,它最终将引用它自己两次,当我将代码放入第一个自我引用时,它就可以正常工作,只要第二个代码的广告就打破了。做一些测试我发现,如果我使用自己的任何一个自我引用自我一切正常,只有当我添加第二个自引用它才会中断。我用于自引用的代码是:
[ForeignKey("ManagerID")]
public User Manager { get; set; }
//Auditing Fields
public DateTime DateCreated { get; set; }
public int? UpdatedByUserID { get; set; }
public DateTime? DateUpdated { get; set; }
public DateTime LastAutoUpdate { get; set; }
[ForeignKey("UpdatedByUserID")]
public User UpdatedByUser { get; set; }
完整的实体代码块是:
public class User
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int ID { get; set; }
public int ADPFileNumber { get; set; }
[Required]
public string ADUserName { get; set; }
public int AirCardCheckInLateCount { get; set; }
[Required]
public string Email { get; set; }
public DateTime? EndDate { get; set; }
[Required]
public string FirstName { get; set; }
[Required]
public string LastName { get; set; }
public int ManagerID { get; set; }
public string MobilePhone { get; set; }
[Required]
public string Office { get; set; }
[Required]
public string Phone { get; set; }
public decimal PTO { get; set; }
public DateTime StartDate { get; set; }
public int VehicleCheckInLateCount { get; set; }
public int WexCardDriverID { get; set; }
[ForeignKey("ManagerID")]
public User Manager { get; set; }
//Auditing Fields
public DateTime DateCreated { get; set; }
public int? UpdatedByUserID { get; set; }
public DateTime? DateUpdated { get; set; }
public DateTime LastAutoUpdate { get; set; }
[ForeignKey("UpdatedByUserID")]
public User UpdatedByUser { get; set; }
}
我错过了什么导致第二个自引用中断?
答案 0 :(得分:2)
您必须明确指出两个关联的主要结尾。你可以用你原来的类来做到这一点,没有反向收集属性:
modelBuilder.Entity<User>()
.HasOptional(u => u.Manager)
.WithMany()
.HasForeignKey(u => u.ManagerID);
modelBuilder.Entity<User>()
.HasOptional(u => u.UpdatedByUser)
.WithMany()
.HasForeignKey(u => u.UpdatedByUserID);
请注意,ManagerID
也应该是int?
。如果需要其他用户预先存在,则无法创建任何User
。这是一个鸡与蛋的问题。
答案 1 :(得分:0)
正如Multiple self-referencing relationships in Entity Framework中提到的,你似乎错过了这段关系的另一部分。
即
[InverseProperty("Manager")]
public virtual ICollection<User> ManagedUsers {get;set;}
[InverseProperty("UpdatedByUser")]
public virtual ICollection<User> UpdatedUsers {get;set;}
编辑:基于@Gert Arnold的回答,您确实应该添加[InverseProperty]属性