Como semear dados com AddOrUpdate com uma chave complexa no EF 4.3

101

Estou tentando semear um banco de dados de desenvolvimento com alguns dados de teste.

Tenho usado context.People.AddOrUpdate(p => p.Id, people));com muito sucesso.

Tenho outra tabela que preciso semear, na qual não saberia a chave primária.

Por exemplo, eu gostaria de AddOrUpdate com base na correspondência de nome e sobrenome.

Não tenho certeza de como escrever a Expressão corretamente.

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

está obviamente incorreto, mas espero que transmita a solução que procuro.

Keith Sirmons
fonte

Respostas:

200

Experimente isto:

context.People.AddOrUpdate(p => new { p.FirstName, p.LastName }, people);
Ladislav Mrnka
fonte
12
@LadislavMrnka e se o identificador precisar ser um tipo complexo, ou seja context.People.AddOrUpdate(p => new { p.Name.FirstName, p.Name.LastName }, people)?
gabe
3
@LadislavMrnka, também, e se a propriedade for do tipo anulável? ou seja context.People.AddOrUpdate(p => new { p.Birthdate }, people)?
stack247 de
2
Algo a se notar aqui é que a coleção de 'pessoas' precisa ser um ARRAY e não uma lista. Se você tiver uma lista de entidades, pode simplesmente chamar .ToArray () na lista. Lutei com isso :) - Boa resposta
Dean Martin
1
não consigo fazer isso funcionar. possivelmente porque (além das 3 propriedades especificadas na chave composta) eu tenho um outro campo de ID com números gerados automaticamente?
Sonic Soul
@LadislavMrnka é necessário manter a pasta Migration (Configuration.cs e ...) após fazer a migração e atualizar os campos do banco de dados ???
AminM
1

Se você entendeu Only primitive types or enumeration types are supported in this context.por usar a propriedade de navegação - considere adicionar a propriedade de chave estrangeira diretamente à entidade (talvez apenas com getter) e use-a como Ladislav Mrnka propôs.

lukyer
fonte
Como adicionar propriedade de navegação de outra chave estrangeira de tabela na code firstabordagem? Eu tenho estrutura como context.People.AddOrUpdate(p => new { p.Name.FirstName, p.Name.LastName }, people)? É possível
yogen darji
Se eu definir o erro da propriedade 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