2015-09-17 9 views
5

Obecnie mam klasę o nazwie EmployeeDetails, która wygląda jak poniżej.Wiele relacji samoreferencyjnych w 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; } 

} 

Próbuję dodać Manager i LineManager właściwości które odwołują się obiekty tego samego typu. Podczas próby dodania migracji pojawia się następujący błąd:

Nie można określić podstawowego związku skojarzeń między typami EmployeeDetails i EmployeeDetails.

Właściwość Menedżer działała zgodnie z oczekiwaniami przed dodaniem właściwości ManagerId, LineManagerId i LineManager.

Jak mogę to rozwiązać?

+0

Jak wygląda twoje mapowanie? Czy w kolumnie LineManagerId jest dodany klucz obcy? –

+0

Nie mam żadnych dodatkowych atrybutów odwzorowania na klasie w tej chwili. – James

+0

Musisz mapować swój klucz obcych za pomocą atrybutu lub płynnego odwzorowania, twoje konwencje nazewnictwa nie są i nie mogą być zgodne z konwencjami, których EF może użyć do ich rozwiązania. –

Odpowiedz

3

Musisz określić drugą stronę relacji. Tak:

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

} 

Generated Migracja

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

Czy to w rozwiązaniu problemu?

+0

To rozwiązuje mój problem. Czy są jakieś materiały referencyjne na temat tego, jak dokładnie EF określa takie relacje? Jestem zainteresowany pracą, dlaczego to sprawia, że ​​relacja jest wyraźniejsza w EF. – James

+0

Istnieje oficjalna strona Dokumentacji EF https://msdn.microsoft.com/en-us/data/ee712907.aspx#apidocs Jednakże, szczerze mówiąc, dokumentacja jest za krótka, a wiele funkcji nie jest wzmiankowany. –

Powiązane problemy