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.