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.

Respuestas:


200

Prueba esto:

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

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 .


¿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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.