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.