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.

Respostas:


200

Experimente isto:

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

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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.