2015-09-17 14 views
5

私は現在、以下のようなEmployeeDetailsというクラスを持っています。Entity Frameworkの複数の自己参照関係

public class EmployeeDetails { 

    public int EmployeeDetailsId { get; set; } 
    public string Name { get; set; } 
    public string Title { get; set; } 

    [ForeignKey("Manager")] 
    public int? ManagerId { get; set; } 
    public virtual EmployeeDetails Manager { get; set; } 
    [ForeignKey("LineManager")] 
    public int? LineManagerId { get; set; } 
    public virtual EmployeeDetails LineManager { get; set; } 

} 

私は、同じタイプのオブジェクトを参照しますManagerLineManagerプロパティを追加しようとしています。 移行を追加しようとすると、次のエラーが発生します。

EmployeeDetailsEmployeeDetailsの間の関連付けの主な終点を特定できません。

ManagerId、LineManagerId、およびLineManagerプロパティを追加する前に、Managerプロパティが正常に機能しました。

どうすれば解決できますか?

+0

マッピングはどのように見えますか? LineManagerId列に外部キーが追加されていますか? –

+0

現時点では、クラスに追加のマッピング属性はありません。 – James

+0

アトリビュートや流暢なマッピングを使用して外部キーをマップする必要があります。ネーミング規則はEFがそれを処理するために使用できる規則に従わず、またそれに従うこともできません。 –

答えて

3

リレーションシップの反対側を指定する必要があります。このように:

public class EmployeeDetails 
{ 

    public int EmployeeDetailsId { get; set; } 
    public string Name { get; set; } 
    public string Title { get; set; } 

    [ForeignKey("Manager")] 
    public int? ManagerId { get; set; } 

    public virtual EmployeeDetails Manager { get; set; } 

    [ForeignKey("LineManager")] 
    public int? LineManagerId { get; set; } 

    public virtual EmployeeDetails LineManager { get; set; } 

    [ForeignKey("ManagerId")] 
    public virtual ICollection<EmployeeDetails> ManagedEmployees { get; set; } 

    [ForeignKey("LineManagerId")] 
    public virtual ICollection<EmployeeDetails> LineManagedEmployees { get; set; } 

} 

生成された移行

CreateTable(
    "dbo.EmployeeDetails", 
    c => new 
     { 
      EmployeeDetailsId = c.Int(nullable: false, identity: true), 
      Name = c.String(), 
      Title = c.String(), 
      ManagerId = c.Int(), 
      LineManagerId = c.Int(), 
     }) 
    .PrimaryKey(t => t.EmployeeDetailsId) 
    .ForeignKey("dbo.EmployeeDetails", t => t.LineManagerId) 
    .ForeignKey("dbo.EmployeeDetails", t => t.ManagerId) 
    .Index(t => t.ManagerId) 
    .Index(t => t.LineManagerId); 

それはあなたの問題を解決していますか?

+0

それは私の問題を解決します。 EFがこれらのような関係をいかに正確に決定するかに関する参考資料はありますか?なぜこれが関係をEFに明確にするのかということに興味を持っています。 – James

+0

公式のEFドキュメントページがあります。https://msdn.microsoft.com/en-us/data/ee712907.aspx#apidocsしかし、正直なところ、ドキュメントは短すぎます。多くの機能はと述べた。 –

関連する問題