主细节/多表的最佳实践/方式在实体框架中插入

时间:2009-07-21 12:10:32

标签: .net linq entity-framework linq-to-entities

我的表结构是这个

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

我正在使用下面的代码尝试使用Entity Framework进行插入操作 这是插入的最佳方式吗?
我对从上下文对象中获取完整产品项的方式感到不满意,而不是只能分配一个简单的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();
}

这是进行主细节插入的正确方法还是更好/另一种方式。

2 个答案:

答案 0 :(得分:2)

你现在正在做的事情会很好。

如果您想在分配ode.Products时避免进行数据库查询,那么您可以使用以下替代方法:

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

这更快,但可读性更低。此外,在您加载它之前,Products属性将为null。但对于插入,这通常都可以。

答案 1 :(得分:1)

另一种方法是使用Stub Objects而不是EntityKeys,即

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

等。作为额外的奖励,此代码将来也将与POCO对象一起使用。

有关该技术的更多信息,请参阅this blog post