7

Używam EntityFramework 5 (lub 4.3 dla .NET Framework 4.0)EntityFramework anonimowy kompozytowa klucz Nazwa obiektu konflikt

W moim obiektu DbContext już ustawione odpowiednie DbSets i obiekty zawierają odpowiednie odnośniki do siebie. To nie jest dla mnie nowe i wszystko działa dobrze.

Teraz w tym przypadku mam kilka kluczy złożonych, które czasami zawierają obcy klucz tabeli (lub obiektu w tym przypadku). W tym celu korzystam z funkcji HasKey<>() w metodzie DbContext w postaci OnModelCreating. Gdy te właściwości mają różne nazwy, nie ma problemu, ale gdy te właściwości mają tę samą nazwę, migracji nie można wykonać.

Przykład:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     // ... 

     modelBuilder.Entity<PatientVisit>().ToTable("PatientVisits"); 
     modelBuilder.Entity<PatientVisit>().HasKey(x => 
      new { x.Patient.Code, x.Code }); 

     // ... 

     base.OnModelCreating(modelBuilder); 
    } 

Jak widać w kodzie dostarczonych PatientVisit obiekt ma właściwość o nazwie Code, ale ta właściwość może być powtarzana tak długo, jak to jest powtarzane z innym pacjentem. Podmiot Pacjent ma również zdefiniowany klucz o nazwie Kod.

Typ anonimowy nie może mieć dwóch właściwości, które wywołują tę samą nazwę (oczywiste). Typowym rozwiązaniem byłoby nazwać właściwości anonimowego typu jak poniżej:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     // ... 

     modelBuilder.Entity<PatientVisit>().ToTable("PatientVisits"); 
     modelBuilder.Entity<PatientVisit>().HasKey(x => 
      new { PatientCode = x.Patient.Code, VisitCode = x.Code }); 

     // ... 

     base.OnModelCreating(modelBuilder); 
    } 

Ale robi to, gdy próbuję dodać migrację tę wiadomość zostanie zgłoszony błąd.

The properties expression 'x => new <>f__AnonymousType3`2(PatientCode 
= x.Patient.Code, VisitCode = x.Code)' is not valid. The expression 
should represent a property: C#: 't => t.MyProperty' VB.Net: 'Function(t) 
t.MyProperty'. When specifying multiple properties use an anonymous 
type: C#: 't => new { t.MyProperty1, t.MyProperty2 }' 
VB.Net: 'Function(t) New With { t.MyProperty1, t.MyProperty2 }'. 

Odpowiedz

0

myślę, co trzeba zrobić tutaj jest dać PatientVisit nową właściwość PatientCode. Który byłby obcy klucz do Patient. Np

HasRequired<PatientVisit>(v => v.Patient).WithMany() 
              .HasForeignKey(v => v.PatientCode) 

Następnie można zrobić

modelBuilder.Entity<PatientVisit>().HasKey(x => 
     new { x.PatientCode, x.Code }); 
+1

wiem, istnieją rozwiązania, które wymagają mi dodać ręcznie klucze i numery ID przywoływanych obiektów, ale to oznacza „zmianę” prostego modelu obiektów do bazy danych -mapowanie modelu, a ja wolę tego nie robić. –

+0

Twoje rozwiązanie jest podobne do tego, które zaimplementowałem, tyle tylko, że nie wymaga płynnego mapowania, ponieważ odbywa się za pomocą DataAnnotations. Zasadniczo używa on atrybutu 'ForeignKey' w celu dołączenia zadeklarowanej właściwości do klucza obcego wirtualnej właściwości nawigacji ... ale nadal oznacza to, że _i musi jawnie zdefiniować właściwości nawigacyjne _i_ właściwości zakotwiczenia lub klucza obcego. Chciałbym mieć czysty, czysty model obiektów bez żadnych kluczowych właściwości związanych z bazą danych. –

+0

Dla przykładu rozwiązania _current-but-not-wanted_, do którego się odnawiam, zobacz [ten wątek] (http://stackoverflow.com/questions/5388077/primary-foreign-key-in-entity-framework) gdzie jest bardzo dobrze wyjaśnione. –

Powiązane problemy