2013-09-04 14 views
6

Używam hierarchii "tabela-za-typ" w moim pierwszym projekcie kodu (EF5). Moi klas pochodnych przesłonić domyślną nazwę klucza podstawowego jasno określić tę zależność z punktu bazy widzenia tak:EF CodeFirst THT - Kolumna "Id" określona jako część tego MSL nie istnieje w MetaDataWorkspace

/* change primary keys to Chair.ProductId and Table.ProductId */ 
modelBuilder.Entity<Chair>() 
    .Property(x => x.Id) 
    .HasColumnName("ProductId"); 

modelBuilder.Entity<Table>() 
    .Property(x => x.Id) 
    .HasColumnName("ProductId"); 

Korzystanie następujące klasy jako przykład:

[Table("Product")] 
public class Product 
{ 
    public int Id {get; set;} 

    /* generic product properties */ 
} 

[Table("Chair")] 
public class Chair : Product 
{ 
    /* specific chair properties */ 
} 

[Table("Table")] 
public class Table : Product 
{ 
    public virtual ICollection<Chair> Chairs {get; set;} 

    /* specific table properties */ 
} 

co powoduje po błędzie na właściwość Table.Chairs: Kolumna "Id" określona jako część tego MSL nie istnieje w MetaDataWorkspace.

Co rozumiem jako EF prawdopodobnie nie widziałem, że PK Krzesło produkt został zmieniony .. (i nadal zakłada, że ​​nazywa się "Id") Ale nie mogę dowiedzieć się, w jaki sposób polecam EF, aby użyć alternate klawisz.

Thx,

PS. Tak, wiem, jeśli nie zmienię nazw PK, to działa ... ale czy można to zrobić za pomocą EF Fluent API?

+2

Znaleziony w roztworze po 30min napisałem. Wszystko co potrzebne do zrobienia było dodać następujący:. modelBuilder.Entity

() .HasMany (x => x.Chairs) .WithMany() Mapa (m => { m.MapLeftKey ("tableid"); m.MapRightKey ("ChairId"); m.ToTable ("TableChairs"); }); I wszystko działało zgodnie z oczekiwaniami;) – Elmar

Odpowiedz

0

Delegowanie Twojego komentarza jako odpowiedź:

Dodaj następujący:

modelBuilder.Entity<Table>().HasMany(x => x.Chairs).WithMany() 
.Map(m => { 
m.MapLeftKey("TableId"); m.MapRightKey("ChairId"); 
m.ToTable("TableChairs"); 
}); 
2

To jest jakiś bug modelu generatora EDMX w Visual Studio.

Aby rozwiązać to zrobić:

  • usunąć konkretnej tabeli z EF.
  • Zapisz EF i uruchom Visual Studio
  • dodać konkretnej tabeli do modelu ponownie
  • zapisać i skompilować

mam Visual Studio 2015 UDPATE 3

+0

Już miałem opublikować to pytanie i odpowiedź, aż znalazłem to. Chciałbym podkreślić ponowne uruchomienie Visual Studio. Cóż za dziwna poprawka. – christo8989

+0

To rozwiązanie wydaje się działać dla mnie, ale problem polega na tym, że muszę ponownie wygenerować tabelę/model (za pomocą dev db), doda inne rzeczy, których nie potrzebuję (lub nie jestem pewien, że są w prod db), które mogą przerwać produkcję. – alltej

+0

Myślę, że jest to uzasadniony błąd w generowaniu EF lub w VS. Podejrzewałem już, że coś nie działa poprawnie na moim komputerze lokalnym, ponieważ dodałem ręcznie kolumnę, która została zamieszczona tutaj: http://stackoverflow.com/questions/35950795/adding-a-new-column-to-an-isting-table-in -entity-framework/38795367 # 38795367 (odpowiedź, którą napisałem jakiś czas temu), ręcznie dodając kolumnę. Aby to udowodnić, proszę mojego współpracownika o ręczne dodanie kolumn w pliku edmx. Sprawdził kod, dostał najnowszą wersję mojego komputera i aktualizacja działa. – alltej

Powiązane problemy