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?

¿Fue útil?

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();
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top