14

Używam Entity Framework 6-code-first z istniejącą bazą danych, ale mam problemy z odwzorowaniem moich jednostek na tabele bazy danych.Code-first: Mapowanie obiektów z istniejącymi tabelami bazy danych

Zwykle używałbym podejścia bazującego na bazie danych i generowanego kodu podmiotu i kontekstu, ale korzystanie z projektanta stało się ogromnym problemem.

Ustawiłem Database.SetInitializer (null), ponieważ nie chcę, aby EF zmieniał mój schemat.

schematu bazy danych:

enter image description here

Code-pierwszy:

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

Kod telefoniczny:

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

Poniżej jest wyjątek:

SQLException Nieprawidłowy nazwa obiektu 'dbo.Projects'.

To dlatego mój tabeli bazy danych jest Projekt a nie Projekty. Nie chcę zmienić nazwy mojego kontekstu na DbSet<Project> na "Projekt", ponieważ byłoby to semantycznie niepoprawne.

Pytanie:

Czy muszę używać biegle adnotacji danych API/mapowanie pomiędzy Projektu tabeli bazy danych i zbiorów DbSet<Project> Projects?

+0

mam wonderung dlaczego to nie działa DbContext ; Tabelę należy nazwać Pomijanie projektów, ale jak już powiedziałeś, możesz użyć adnotacji Danych, aby wymusić nazwę [Tabela ("Projekty")]. –

+0

spróbuj wywołać inicjator przed utworzeniem DBContext; połóż to gdzieś na zewnątrz. –

Odpowiedz

18

Można użyć

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

adnotacji przeciwko podmiotowi Projektu lub w OnModelCreating(DbModelBuilder modelBuilder) można nazwać modelBuilder.Entity<Project>().ToTable("Project");.

Oboje zrobiliby to samo.

+0

Czy któryś z nich rozpozna moje klucze tabeli, więzy i relacje lub czy muszę to jawnie oznaczyć? – davenewza

+0

Nie wiem. Pomyślałbym, że klucze * powinny * być w porządku, ponieważ używasz konwencji Entity + Id, ale ponowne mapowanie tabel * może * powodować problemy (przepraszam IDK). Masz adnotację KeyAttribute dla kluczy i istnieje możliwość mapowania tych i twoich relacji w narzędziu do tworzenia modeli. – AlexC

9

Należy zdefiniować klasę (czyli: ProjectMap), która dziedziczy z klasy generycznej EntityTypeConfiguration(T) gdzie T jest tu klasa Project. W tym ProjectMap klasie można zdefiniować jednoznacznie mapowanie tabeli:

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

Klasa ProjectMap powinny być nazywane w następujący sposób swojej klasie

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

Wznawiana dla wzmianki o 'EntityTypeConfiguration', utrzymuje odwzorowania czyste i oddzielone dla każdego Modelu. –