2016-04-17 7 views
1

Ich habe zwei Klassen. Die erste ist dies:Entity Framework-Code zuerst: Wie man eine Eins-zu-Eins-Beziehungen ohne das Konzept von "Principal" und die gleiche ID setzen?

public class User 
{ 
    public int Id { get; set; } 
    public string UserName { get; set; } 
    public string Password { get; set; } 
    public string Name { get; set; } 
    public DateTime Birth { get; set; } 
    public Sex Sex { get; set; } 
    public List<Album> Albums { get; set; } 
    public DateTime Created { get; set; } 

    public Picture ProfilePicture { get; set; } 
} 

Und das zweite ist dies:

public class Picture 
{ 
    public int Id { get; set; } 
    public Album Album { get; set; } 
    public string Path { get; set; } 
    public string Description { get; set; } 
    public DateTime Created { get; set; } 

    public User User { get; set; } 
} 

Bilder werden in einer Tabelle gespeichert, und ein Benutzer kann so viele Bilder haben, wie er in Alben wollen, und sie sind Zugriff über Alben. Hier ist die Album Klasse:

public class Album 
{ 
    public int Id { get; set; } 
    public User User { get; set; } 
    public AlbumType Type { get; set; } 
    public List<Picture> Pictures { get; set; } 
    public string Name { get; set; } 
    public DateTime Created { get; set; } 
} 

ein Picture Objekt hat, möchte ich in der Lage sein, den User Besitzer dieses Bild zurückzuholen, so etwas wie picture.User tun, die derzeit arbeitet. Aber nur eines dieser Bilder kann das Profilbild sein. Da das Profilbild fast immer abgerufen wird, würde Ich mag in Code, so etwas zu tun in der Lage:

LoadPicture(user.ProfilePicture.Id); 

Mein Problem ist, dass EF denkt, dass ich in dem eine Eins-zu-Eins-Beziehung erstellen mag ich müssen einen Principal definieren und beide Entitäten müssen dieselbe ID haben. Picture Entitäten müssen ihre eigene ID haben und User müssen auch ihre eigene ID haben. Wie kann ich das zu EF so sagen user.ProfilePicture.Id funktioniert?

Jede Hilfe wird geschätzt.

+0

Verstehe ich richtig, dass das Datenbankmodell nicht geändert werden kann? –

+0

@GertArnold Es kann geändert werden.Die Idee besteht darin, einfach die ID seines Profilbildes in den Datensatz des Benutzers zu schreiben und im Code das Bildobjekt mit einer Codezeile wie 'user.ProfilePicture' zu ​​erhalten. Mit anderen Worten, es sollte in der Benutzertabelle ein Fremdschlüssel mit der ID 'Bild' anstelle eines Fremdschlüssels mit der ID 'Benutzer' in der Bildtabelle vorhanden sein und 'user.ProfilePicture' geschrieben werden können. Ich weiß nicht, wie ich es zuerst mit Code machen soll. Vielleicht kann es nicht gemacht werden. Mit nur EF, vielleicht ja, aber mit Code zuerst, vielleicht nein. – amedina

Antwort

2

Mit einem Picture-Objekt möchte ich in der Lage sein, den User-Besitzer dieses Bildes abzurufen, indem ich etwas wie picture.User mache, das momentan funktioniert.

Ich würde Ihnen vorschlagen, entweder zu entfernen oder Umbenennen der User Eigenschaft, da sie irreführend ist - der Besitzer des Bildes ist Picture.Album.User, während diese Eigenschaft wirklich die Rückseite des User.ProfilePicture darstellt.

Auch Sie müssen wirklich (als Ausnahmezustand) den Principal/abhängigen Teil der User.ProfilePicture Beziehung mit fließenden API auflösen. So

, hier sind die Optionen:

(A) entfernen Sie die Picture.User Eigenschaft

public class Picture 
{ 
    public int Id { get; set; } 
    public Album Album { get; set; } 
    public string Path { get; set; } 
    public string Description { get; set; } 
    public DateTime Created { get; set; } 
} 

und die folgenden Befehle verwenden innerhalb des Ihre DbContext OnModelCreating Überschreibung:

modelBuilder.Entity<User>() 
    .HasOptional(e => e.ProfilePicture) 
    .WithOptionalPrincipal(); 

(B) Benennen Sie die Picture.User Eigenschaft

um wobei FK zum User Tabelle

und verwenden

modelBuilder.Entity<User>() 
    .HasOptional(e => e.ProfilePicture) 
    .WithOptionalPrincipal(e => e.ProfileOf); 

Beide Optionen werden int? Spalte in der Tabelle Picture einzuführen.

+0

Ich habe den (A) Vorschlag berücksichtigt, danke dafür, aber ich möchte eine Spalte der ID des Bildes in der Benutzertabelle behalten, um einen Fremdschlüssel in die Tabelle des Bildes zu erstellen, der nur auf das des Benutzers zeigt, welches Bild das ist Profilbild möchte ich vermeiden. Irgendwelche Vorschläge? – amedina

+0

@Kuma nur wenn 'Bild'-' Benutzer' ist 1: n. Und es ist * 1: n, weil es im Datenmodell nichts gibt, das verhindert, dass mehrere Benutzer auf dasselbe Bild verweisen. Sie müssen dies durch eine Form der Validierung ausschließen. –

+0

Sie können dies tun, indem Sie in der Konfiguration das Wort 'Principal' in' Dependent' ändern, aber beachten Sie, dass es einen Abhängigkeitszyklus erzeugt, dh Benutzer erstellen, Album erstellen, Bild erstellen, Bild als Benutzerprofilbild festlegen - EF kann das nicht verarbeiten in einer einzigen Transaktion. –