2016-02-26 4 views
5

最初に、Unable to determine the principal end of an association between the typesエラーに関する多くの投稿がありますが、ごめんなさい。モデルに2番目の自己参照FKを追加できません。元の終了エラーを特定できません。

自己を2回参照するようになるEntityを構築しました。最初の自己参照のためにコードを挿入すると、すぐに広告が2番目のコードが破損するとすぐに正常に動作します。いくつかのテストを行っていますが、自己参照のいずれかを自己によって使用すると、すべてがうまく動作することがわかりました。それは、それが壊れた2番目の自己参照を追加するときだけです。自己参照のための私が使用していたコードは次のとおりです。

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

答えて

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を作成することはできません。それは鶏と卵の問題です。

+0

のためには作成しません。しかし、これは唯一の方法ですか?むしろ、クラス内のエンティティ定義全体を分割しないでください。 – Matthew

+0

ルイスが提案した2つの逆コレクションプロパティを使うことができます(ただし、 '[InverseProperty]'属性も使用できます)。これらがなければ(あなたが好むように思われる)、唯一の方法は流暢なマッピングを使用することです。 –

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

EDIT:@Gertアーノルドの答えに基づいて、あなたは確かにあなたが明示的に両方の団体の主な終わりを示すために持っている[InverseProperty]属性

+0

リンクされた質問と回答に基づいてコードを更新しましたが、コードが作成されている間に2番目のキーは作成されません。それはManagerIDのためのFKを作成しますが、UpdatedByUserID – Matthew

関連する問題