2009-07-21 17 views
6
estructura

Mi mesa es estemejores prácticas/camino para el detalle maestro/Insertar varias mesas en Entity Framework

Orders 
------ 
Id int identity 
OrderDate smalldatetime 
OrderStatusid tinyint 

Products 
-------- 
Id int identity 
Name varchar(50) 

OrderDetails 
------------ 
Id int identity 
OrderId int (fkey) 
ProductId int (fkey) 
Amount decimal 
Rate decimal 

Estoy intentando una operación de inserción utilizando Entity Framework utilizando el código de abajo
¿Es esta la mejor manera para hacer la inserción?
No estoy contento con la forma en que estoy recibiendo el elemento completo del producto desde el objeto de contexto, en lugar de ser capaz de simplemente asignar un simple valor productId

using (MyContextEntities ctx = new MyContextEntities()) 
{ 
    Orders newOrder = new Orders() 
    { 
    Name = "Gayle Wynand", 
    OrderDate = DateTime.Now, 
    IsComplete = true, 
    Comments = "test", 
    OrderStatusId = 2, 
    IsActive = true 
    }; 
    OrderDetails ode = new OrderDetails(); 
    ode.Products = ctx.Products.First(p => p.Id == 2); // any other way? 
    ode.Quantity = 2; 
    ode.Rate = 5.2; 
    newOrder.OrderDetails.Add(ode); 

    OrderDetails ode2 = new OrderDetails(); 
    ode2.Products = ctx.Products.First(p => p.Id == 3); // any other way? 
    ode2.Quantity = 3; 
    ode2.Rate =6.5; 
    newOrder.OrderDetails.Add(ode2); 


    ctx.AddToOrders(newOrder); 
    ctx.SaveChanges(); 
} 

es esta la forma correcta de hacer el maestro detalle inserte o hay una mejor/otra forma.

+0

falta 'AddTo ' ... ¡Gracias! – nrod

Respuesta

2

Lo que está haciendo ahora funcionará bien.

Si desea evitar hacer una consulta de base de datos al asignar ode.Products, entonces se podría utilizar la siguiente alternativa:

// substitute your actual qualified entity set name 
ode.ProductsReference.EntityKey = 
    new EntityKey("MyEntities.ProductsEntitySetName", "Id", 2); 

Esto es más rápido, pero menos legible. Además, la propiedad Products será nula hasta que la cargue. Pero para una inserción, esto a menudo está bien.

+0

¿Y hay accesos directos para actualizar los datos maestros de detalles? –

+0

No estoy seguro de lo que quieres decir. ¿Qué tipo de atajos estás esperando? ¿Puedes ser más específico acerca de tus necesidades? –

+0

Quería saber cómo iba a hacer exactamente la misma acción anterior, pero para una operación de actualización. –

1

Otro enfoque sería el uso del trozo de objetos en lugar de decir EntityKeys

var product = new Product {ID = 2}; 
ctx.AttachTo("Products", product); 
ode.Product = product; 

etc. Como un beneficio adicional este código trabajará con objetos POCO también en el futuro.

Consulte this blog post para obtener más información sobre esa técnica.

+0

Intenté esto primero y descubrí que al llamar a ctx.SaveChanges() intenta insertar incluso los Productos –