2016-07-03 2 views
3

ich eine einfache Master-Detail-Beziehung ersten EF mit dem Code haben:Entity Framework, mit dem Code zuerst: die Kombination von Master-Detail mit Null-zu-Eins-Beziehung

public class User 
{ 
    public string Id { get; set; } 
    public ICollection<Tasks> Tasks { get; set; } 
} 

public class Task 
{ 
    public string Id { get; set; } 

    [Required] 
    public string UserId { get; set; } 
    public User User { get; set; } 
} 

Jetzt möchte ich es so modifizieren, dass die Nutzer kann eine einzige, wichtigste Aufgabe haben. So ändere ich die User-Klasse, um es hinzuzufügen:

public class User 
{ 
    public string Id { get; set; } 
    public ICollection<Tasks> Tasks { get; set; } 
    public string MostImportantTaskId { get; set; } 

    [ForeignKey("MostImportantTaskId")] 
    public Task MostImportantTask { get; set; } 
} 

Als ich Add-Migration laufen, aber ich bekomme ein unerwartetes Ergebnis. EF versucht, eine User_Id Spalte auf der Tasks Tabelle hinzuzufügen, die ich nicht will, und Fallenlassen der Fremdschlüssel ich für den Master/Detail-Beziehung müssen:

public override void Up() 
{ 
    DropForeignKey("dbo.Tasks", "UserId", "dbo.Users"); 
    AddColumn("dbo.Tasks", "User_Id", c => c.String(maxLength: 128)); 
    AddColumn("dbo.Users", "MostImportantTaskId", c => c.String(maxLength: 128)); 
    CreateIndex("dbo.Tasks", "User_Id"); 
    CreateIndex("dbo.Users", "MostImportantTaskId"); 
    AddForeignKey("dbo.Users", "MostImportantTaskId", "dbo.Tasks", "Id"); 
    AddForeignKey("dbo.Tasks", "User_Id", "dbo.Users", "Id"); 
} 

public override void Down() 
{ 
    // ... 
} 

Wie pflege ich den Master-Detail-Beziehung zwischen Benutzern und Aufgaben, während der Klasse User ein Verweis auf eine einzelne Aufgabe hinzugefügt wird?

Antwort

3

Es ist nicht etwas, das ich übermäßig vertraut bin, aber ich glaube, was Sie suchen, ist InverseProperty. Da Ihre User Klasse mehrere Beziehungen mit Task hat, müssen Sie die InverseProperty zu Ihrer Tasks Sammlung hinzufügen, um sie auf die User Eigenschaft auf Task zu verweisen.

Also, wenn Sie diese Änderung

[InverseProperty("User")] 
public ICollection<Task> Tasks { get; set; } 

dann in Ihrer User Klasse machen, wenn Sie eine Migration der folgenden Code ausführen erzeugt wird, das, was Sie zu sein Aussehen sind nach

public override void Up() 
{ 
    AddColumn("dbo.Users", "MostImportantTaskId", c => c.String(maxLength: 128)); 
    CreateIndex("dbo.Users", "MostImportantTaskId"); 
    AddForeignKey("dbo.Users", "MostImportantTaskId", "dbo.Tasks", "Id"); 
} 

public override void Down() 
{ 
    DropForeignKey("dbo.Users", "MostImportantTaskId", "dbo.Tasks"); 
    DropIndex("dbo.Users", new[] { "MostImportantTaskId" }); 
    DropColumn("dbo.Users", "MostImportantTaskId"); 
} 

Based an einem Beispiel unter entityframeworktutorial.net.

Anmerkung: Ich habe angenommen, in dem Sie eine Tasks Klasse in Ihrem Code verwiesen habe es für Task.

war ein Tippfehler
Verwandte Themen