Cómo sembrar datos con AddOrUpdate con una clave compleja en EF 4.3

101

Estoy tratando de sembrar una base de datos de desarrollo con algunos datos de prueba.

Lo he usado context.People.AddOrUpdate(p => p.Id, people));con mucho éxito.

Tengo otra tabla que necesito sembrar, en la que no sabría la clave principal.

Por ejemplo, me gustaría AddOrUpdate en función de la coincidencia de los nombres y apellidos.

No estoy seguro de cómo escribir la expresión correctamente.

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

es obviamente incorrecto, pero espero que transmita la solución que estoy buscando.

Keith Sirmons
fuente

Respuestas:

200

Prueba esto:

context.People.AddOrUpdate(p => new { p.FirstName, p.LastName }, people);
Ladislav Mrnka
fuente
12
@LadislavMrnka ¿y si el identificador debe ser de un tipo complejo, es decir context.People.AddOrUpdate(p => new { p.Name.FirstName, p.Name.LastName }, people)?
gabe
3
@LadislavMrnka, también, ¿qué pasa si la propiedad es un tipo anulable? es decir context.People.AddOrUpdate(p => new { p.Birthdate }, people)?
stack247
2
Algo a tener en cuenta aquí es que la colección de 'personas' debe ser un ARRAY y no una lista. Si tiene una lista de entidades, simplemente puede llamar a .ToArray () en la lista. Luché con eso :) - Buena respuesta
Dean Martin
1
no puedo hacer que esto funcione. posiblemente porque (además de las 3 propiedades especificadas en la clave compuesta) tengo otro campo de identificación con números generados automáticamente?
Sonic Soul
@LadislavMrnka es necesario mantener la carpeta de migración (Configuration.cs y ...) después de realizar la migración y actualizar los campos de la base de datos.
AminM
1

Si lo consiguió Only primitive types or enumeration types are supported in this context.debido al uso de la propiedad de navegación, considere agregar la propiedad de clave externa directamente a la entidad (tal vez solo con el getter) y úsela como propuso Ladislav Mrnka .

lukyer
fuente
¿Cómo agregar la propiedad de navegación de otra clave externa de tabla en el code firstenfoque? Tengo estructura como context.People.AddOrUpdate(p => new { p.Name.FirstName, p.Name.LastName }, people)? Es esto posible
yogen darji
Si configuro el error de propiedad del getter esThe specified type member 'NameId' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported.
yogen darji