2016-06-27 9 views
0

Ich habe eine bestehende Datenbank, die ich Entity Framework Code zuerst gegen die einfachste Art und Weise verwenden möchte. Es ist nur eine kleine Datenbank.Entity Framework Code Erste bestehende Datenbank Mapping-Beziehung

Ich habe einfach POCO-Klassen erstellt, die die Datenbanktabellen spiegeln:

z.B.

enter image description here

public class Author 
{ 
    [Key] 
    public int AuthorID { get; set; } 
    public string AuthorName { get; set; } 
    public virtual ICollection<Books> Books { get; set; } 
} 

public class Books 
{ 
    [Key] 
    public int BookID { get; set; } 
    public string BookName { get; set; } 
    public int AuthorID { get; set; } 

} 

Und ein DbContext wie folgt:

public class Entities : DbContext 
{ 
    public Entities(string connString) 
    : base(connString) 
{ 
} 
    public DbSet<Author> Authors { get; set; } 
    public DbSet<Books> Books { get; set; } 

Wenn ich meine Anwendung ausführen, und den ersten Autor aus meiner Datenbank auswählen, werden die AuthorID und Author Eigenschaften korrekt ausgefüllt. Die Sammlung von Büchern wird jedoch nicht aufgefüllt. Stattdessen gibt es eine Ausnahme vom Typ 'System.Data.EntityCommandExecutionException' und eine innere Ausnahme von: 'Ungültiger Spaltenname' Author_AuthorID '.

Wie kann ich die Verbindung zwischen Autor und Büchern korrekt herstellen? (d. h. eins zu viele, ein Autor kann viele Bücher haben). Ich habe den Code First ganz einfach erstellt - keine Migrationen oder automatische Generierung in irgendeiner Weise, und möchte es so einfach halten.

Vielen Dank für jede Hilfe, Martin

Antwort

1

hinzufügen Author Eigenschaft (ohne es einzelne AuthorID Immobilie Kontext der Beziehung mit Autoren Tabelle keine Rolle.):

public class Books 
{ 
    [Key] 
    public int BookID { get; set; } 
    public string BookName { get; set; } 
    public int AuthorID { get; set; } 

    //add this(attribute is not needed if you use EF6 or higher): 
    [ForeignKey("AuthorID")] 
    public virtual Author Author { get; set; } 
} 
+0

Dank Slava. Ich fand, dass dies immer noch einen Fehler gibt, aber das Hinzufügen der Annotation [ForeignKey ("Autor")] behebt dies zusätzlich (siehe unten). – Martin

+0

Ich denke, Sie sollten Anmerkung [ForeignKey ("Autor")] in AuthorID Eigenschaft hinzufügen. um zu verhindern, redundante –

+0

Es ist seltsam, in meinem Fall alle Arbeiten korrekt und Attribut nicht erforderlich, weil Namen Konventionen: 'AutorID' = _Author + ID_. Kann sein, hängt es von der Version von EF ab, im Falle von EF6 ist es funktioniert, was ist Ihre Version? –

0

Nun, dies ist peinlich, ich fand eine Antwort Minuten nach meiner Post. Ich werde die Antwort veröffentlichen, anstatt meine Frage, falls das Löschen hilft es jemand anderes:

public class Books 
{ 
    [Key] 
    public int BookID { get; set; } 
    public string BookName { get; set; } 

    [ForeignKey("Author")] 
    public int AuthorID { get; set; }  
    public Author Author { get; set; } 

} 
1

Fluent API Ansatz:

modelBuilder.Entity<Author>().HasMany(a => a.Books).WithRequired().HasForeignKey(b => b.AuthorID); 

Update: mit dieser fließend API Sie müssen nicht hinzufügen Eigenschaft Autor in Class Books

Wenn Sie Books als nicht erforderlich festlegen möchten, müssen Sie die Eigenschaft AuthorID auf int setzen?

modelBuilder.Entity<Author>().HasMany(a => a.Books).HasForeignKey(b => b.AuthorID); 

Bücher Klasse:

public class Books 
{ 
    [Key] 
    public int BookID { get; set; } 
    public string BookName { get; set; } 
    public int? AuthorID { get; set; } 

} 
Verwandte Themen