Jak wysyłać dane za pomocą AddOrUpdate ze złożonym kluczem w EF 4.3

101

Próbuję wypełnić bazę danych programistycznych z danymi testowymi.

Użyłem context.People.AddOrUpdate(p => p.Id, people));z dużym powodzeniem.

Mam inną tabelę, którą muszę zasiać, w której nie znam klucza podstawowego.

Na przykład chciałbym AddOrUpdate na podstawie dopasowania imienia i nazwiska.

Nie jestem pewien, jak poprawnie napisać wyrażenie.

context.People.AddOrUpdate(p => p.FirstName && p.LastName, people);

jest oczywiście niepoprawny, ale mam nadzieję, że zapewnia rozwiązanie, którego szukam.

Keith Sirmons
źródło

Odpowiedzi:

200

Spróbuj tego:

context.People.AddOrUpdate(p => new { p.FirstName, p.LastName }, people);
Ladislav Mrnka
źródło
12
@LadislavMrnka co jeśli identyfikator musi być typem złożonym, tj. context.People.AddOrUpdate(p => new { p.Name.FirstName, p.Name.LastName }, people)?
gabe
3
@LadislavMrnka, także, co jeśli właściwość jest typem dopuszczającym wartość null? czyli context.People.AddOrUpdate(p => new { p.Birthdate }, people)?
stack247
2
Należy tu zauważyć, że kolekcja „people” musi być tablicą, a nie listą. Jeśli masz listę encji, możesz po prostu wywołać .ToArray () na liście. Walczyłem z tym :) - Dobra odpowiedź
Dean Martin
1
nie mogę tego zmusić do pracy. prawdopodobnie dlatego, że (oprócz 3 właściwości określonych w kluczu złożonym) mam inne pole ID z numerami generowanymi automatycznie?
Sonic Soul
@LadislavMrnka musi zachować folder migracji (Configuration.cs i ...) po wykonaniu migracji i aktualizacji pól bazy danych ???
AminM
1

Jeśli otrzymałeś z Only primitive types or enumeration types are supported in this context.powodu używania właściwości nawigacji - rozważ dodanie własności klucza obcego bezpośrednio do encji (może tylko z getter) i użyj jej tak, jak zaproponował Ladislav Mrnka .

lukyer
źródło
Jak dodać właściwość nawigacji innego klucza obcego tabeli w code firstpodejściu? Mam strukturę jak context.People.AddOrUpdate(p => new { p.Name.FirstName, p.Name.LastName }, people)? To możliwe
yogen darji,
Jeśli The specified type member 'NameId' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported.
ustawię