6

Próbuję odwzorować hierarchię dziedziczenia TPT w starszej bazie danych (nie mogę zmienić nazw kolumn). Wszystkie przykłady mają klucze podstawowe tabel nadrzędnych i podrzędnych o tej samej nazwie. Niestety, mój nie zachowuje się w ten sposób.Mapowanie TPT w kodzie EF Najpierw 4.1 z różnymi kluczami podstawowymi

W uproszczonym przykładzie:

Vehicle 
---------------- 
VehicleId 
Make 
Model 
---------------- 

Car 
---------------- 
CarId   
SomeOtherField 
---------------- 

CarId i VehicleId są rzeczywiście sam identyfikator i są to wartości, które powinny być stosowane w celu powiązania tabele. Czy istnieje wsparcie dla tworzenia tego jako relacji TPT w Code First?

Odpowiedz

3

Here jest oświadczenie o tym problemie z zespołu EF:

Niestety nie jest to możliwe na tym etapie. Rozumiem, że nie jest to doskonała odpowiedź, ale jedną z opcji byłoby utworzenie widoku, który zmienia nazwę kolumny PK/FK na , a następnie mapuje do niej.

Pochodzi z lutego 2011. Było więc związane z wcześniejszą wersją kodu EF w wersji CTP. Uważam jednak, że ten scenariusz nadal nie jest obsługiwany w wersji EF 4.1.

również podobne pytanie tutaj z niespełniających rezultat dotyczące EF 4.1 Code-pierwszy: How can I use TPT inheritance models when primary keys have different names?

+0

Dzięki - faktycznie widziałem inne S.O. pytanie i na to nigdy nie odpowiedziano. Chyba miałem nadzieję, że coś się zmieniło ... –

+1

Czy wiesz, dlaczego ten problem istnieje? Ponieważ kod pierwszy został opracowany jako "pierwszy kod". Wszystkie wstępne artykuły dotyczące używania DbContext z istniejącą bazą danych obejmowały EDMX. Korzystanie z płynnego mapowania z istniejącą bazą danych było po prostu czymś, co wydarzyło się naturalnie, ale uważam, że nie było tak przez większość czasu w fazie rozwoju. Z tego powodu ta funkcja nigdy nie była potrzebna, ponieważ podczas odwzorowywania dziedziczenia z kodu masz tylko jedną właściwość Id zdefiniowaną w klasie bazowej, a pozwolisz EF na wykonanie swojej pracy. –

+0

@ Ladislav: Brzmi niewiarygodnie! – Slauma

1

Dostałem to do pracy, wykonując następujące czynności:

  1. Usuń wszystkie właściwości nawigacji pomiędzy podstawą a dziedziczone obiekty.
  2. Usuń klucz obcy z dziedziczonych obiektów, a także usuń odwzorowanie właściwości dla klucza obcego w odziedziczonych obiektach.
  3. Usunięcie mapowania tabel w odziedziczonych obiektach.
  4. Dodaj opcję generowanej tożsamości bazy danych do klucza podstawowego dziedziczonych obiektów (jeśli używasz tożsamości na PK).
  5. Dodaj mapę dla typu bazowego do typu pochodnego, a (ważny bit) na mapie jawnie odwzoruj każdą właściwość nie pojawiającą się w klasie bazowej/tabeli. Na mapie również odwzoruj typ wyprowadzony na tabelę typu pochodnego.

To powinno zrobić wiele. Link do przykładowego rozwiązania w EF < -> RIA < -> Silverlight, który pokazuje także obejście dla właściwości o identycznej nazwie w typach bazowych i pochodnych (rozwiązaniem jest zasadniczo zmiana nazwy właściwości w bazie typy typu lub pochodne).

http://dotnetdavis.com/upload/content/source.zip

0

znalazłem odpowiedź na ten artykuł tutaj: http://entityframework.codeplex.com/workitem/2087. Dla Państwa przypadku trzeba:

  1. w C# określić podmiot pojazdu (VehicleId, marka, model)
  2. w C# określić podmiot samochodów (SomeOtherField), pochodzący z kolumny pojazdów // CarId będzie mapować do VehicleId, patrz poniżej w jaki sposób.
  3. W 'protected override void OnModelCreating (DbModelBuilder ModelBuilder)' to zrobić:

    modelBuilder.Entity() .ToTable ("samochód") .Property (t => t.VehicleId) .HasColumnName (” CarId ");

Powiązane problemy