14

Ich verwende Entity Framework 6 Code-First mit einer vorhandenen Datenbank, aber mit Problemen bei der Zuordnung meiner Entitäten zu den Datenbanktabellen.Code-first: Zuordnung von Entitäten zu vorhandenen Datenbanktabellen

Normalerweise würde ich Datenbank-First-Ansatz verwenden und haben meine Entität und Kontext-Code generiert, aber die Verwendung des Designers ist ein großer Schmerz geworden.

Ich habe Database.SetInitializer (null) gesetzt, wie ich EF nicht mein Schema ändern möchte.

Datenbankschema:

enter image description here

-Code-first:

public class Project 
{ 
    public int ProjectId { get; set; } 

    public string Name { get; set; } 

    public string Description { get; set; } 
} 

public class ReleaseControlContext : DbContext 
{ 
    public ReleaseControlContext() 
     : base(ConfigurationManager.ConnectionStrings["ReleaseControl"].ConnectionString) 
    { 
     Database.SetInitializer<ReleaseControlContext>(null); 
    } 

    public DbSet<Project> Projects { get; set; } 
} 

Telefonvorwahl:

using(var context = new ReleaseControlContext()) 
{ 
    var projects = context.Projects.ToList(); 
} 

Die folgende Ausnahme ausgelöst:

SqlException: Ungültige Objektnamen 'dbo.Projects'. Diese

ist, weil meine Datenbanktabelle Projekt und nicht Projekte sind. Ich möchte nicht die DbSet<Project> meines Kontextes in "Project" umbenennen, weil das semantisch inkorrekt wäre.

Frage:

Muß ich die fließend API/Daten Anmerkungen zwischen der Projekt Datenbanktabelle und der DbSet<Project> Projects Sammlung zur Karte benutzen?

+0

genannt werden, warum es nicht funktioniert ; Die Tabelle muss Projekte heißen, die etwas schiefgehen, aber wie Sie bereits sagten, können Sie den Namen mit Data Annotation erzwingen [Tabelle ("Projekte")]. –

+0

versuchen, den Initialisierer aufzurufen, bevor Sie den DBContext erstellen; leg es irgendwo hin. –

Antwort

18

können Sie die

[Table("Project")] 
public class Project { 
.... 
} 

Anmerkung gegen die Entität Projekt verwenden oder in der OnModelCreating(DbModelBuilder modelBuilder) können Sie modelBuilder.Entity<Project>().ToTable("Project"); nennen.

Beide würden das gleiche tun.

+0

Würde eines dieser Elemente meine Tabellenschlüssel, Einschränkungen und Beziehungen erkennen oder muss ich dies explizit angeben? – davenewza

+0

Ich weiß es nicht. Ich hätte gedacht, dass die Schlüssel * in Ordnung sein sollten, indem Sie die Konvention von Entity + Id verwenden, aber die Neuabbildung der Tabellen * kann * Probleme verursachen (sorry IDK). Sie verfügen über die KeyAttribute-Annotation für Ihre Schlüssel, und Sie können diese und Ihre Beziehungen im Model Builder zuordnen. – AlexC

9

Sie sollten eine Klasse definieren (dh: ProjectMap), die von der allgemeinen Klasse erbt EntityTypeConfiguration(T) wo T hier ist Ihre Project Klasse. In diesem ProjectMap Klasse können Sie explizit eine Tabellenzuordnung definieren:

this.ToTable("Project", "dbo"); 

Die Klasse ProjectMap sollte ich wonderung in der folgenden Methode Ihrer DbContext Klasse

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Configurations.Add(new ProjectMap()); 
} 
+1

Upvoted für die Erwähnung von "EntityTypeConfiguration", hält die Zuordnungen sauber und getrennt für jedes Modell. –