¿Cómo crear relaciones de clave externa con Entity Framework?
-
10-07-2019 - |
Pregunta
Deseo crear una nueva fila en mi base de datos en una tabla que tenga un par de relaciones de claves externas y no he podido controlar qué orden y qué llamadas deben hacerse. Esto es lo que tengo hasta ahora:
db.Models.Order order = DB.Models.Order.CreateOrder( apple );
order.CustomerReference.Attach( ( from c in db.Customer where c.Id == custId select c ).First() );
db.SaveChanges();
El código falla en la segunda línea allí, diciendo:
Adjuntar no es una operación válida cuando el objeto fuente asociado con esto final relacionado está en un agregado, eliminado, o estado separado. Objetos cargados utilizando la opción de combinación NoTracking son siempre separado.
¿Alguna idea?
Solución
(Gracias John por las correcciones gramaticales)
Así que lo descubrí. Esto es lo que tienes que hacer:
db.Models.Order order = DB.Models.Order.CreateOrder( apple );
order.Customer = (from c in db.Customer where c.Id == custId select c).First();
db.SaveChanges();
Espero que eso ayude a las personas.
Otros consejos
¿Por qué no usar referencias de entidad? Su método provocará una declaración SELECT
adicional.
Una forma mucho más agradable es usar la clase CustomerReference
y una EntityKey
.
order.CustomerReference = new System.Data.Objects.DataClasses.EntityReference<Customers>();
order.CustomerReference.EntityKey = new EntityKey("ModelsEntities.Customers", "Id", custId);
Para actualizar aquí hay un código de muestra:
using (var ctx = new DataModelEntities())
{
var result = (from p in ctx.UserRole.Where(o => o.UserRoleId == userRole.UserRoleId)
select p).First();
result.RolesReference.EntityKey = new EntityKey("DataModelEntities.Roles",
"RoleId", userRole.RoleId);
result.UserRoleDescription = userRole.UserRoleDescription;
ctx.SaveChanges();
}