Come eseguire il seeding dei dati con AddOrUpdate con una chiave complessa in EF 4.3


101

Sto provando a seminare un database di sviluppo con alcuni dati di test.

L'ho usato context.People.AddOrUpdate(p => p.Id, people));con molto successo.

Ho un'altra tabella che devo seminare, in cui non conoscerei la chiave primaria.

Ad esempio, vorrei AddOrUpdate in base alla corrispondenza del nome e del cognome.

Non sono sicuro di come scrivere correttamente l'espressione.

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

è ovviamente errato, ma spero che trasmetta la soluzione che sto cercando.

Risposte:


200

Prova questo:

context.People.AddOrUpdate(p => new { p.FirstName, p.LastName }, people);

12
@LadislavMrnka cosa succede se l'identificatore deve essere un tipo complesso, ad esempio context.People.AddOrUpdate(p => new { p.Name.FirstName, p.Name.LastName }, people)?
gabe

3
@LadislavMrnka, inoltre, cosa succede se la proprietà è un tipo nullable? cioè context.People.AddOrUpdate(p => new { p.Birthdate }, people)?
stack247

2
Qualcosa da notare qui è che la raccolta "persone" deve essere un ARRAY e non un elenco. Se hai un elenco di entità, puoi semplicemente chiamare .ToArray () nell'elenco. Ho lottato con quello :) - Buona risposta
Dean Martin

1
non riesco a farlo funzionare. forse perché (oltre alle 3 proprietà specificate nella chiave composita) ho un altro campo ID con numeri generati automaticamente?
Sonic Soul

@LadislavMrnka è necessario mantenere la cartella Migration (Configuration.cs e ...) dopo la migrazione e l'aggiornamento dei campi del database ???
AminM

1

Se hai ottenuto a Only primitive types or enumeration types are supported in this context.causa dell'utilizzo della proprietà di navigazione, considera l'aggiunta della proprietà della chiave esterna direttamente all'entità (forse solo con getter) e usala come ha proposto Ladislav Mrnka .


Come aggiungere la proprietà di navigazione di un'altra chiave esterna della tabella code firstnell'approccio? Ho struttura come context.People.AddOrUpdate(p => new { p.Name.FirstName, p.Name.LastName }, people)? È possibile
yogen darji

Se imposto l'errore della proprietà getter èThe specified type member 'NameId' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported.
yogen darji
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.