.net 实体框架中主细节/多表插入的最佳实践/方法

.net 实体框架中主细节/多表插入的最佳实践/方法,.net,linq,entity-framework,linq-to-entities,.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

我的桌子结构是这样的

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

这是进行主细节插入的正确方法还是有更好的/其他方法。

您现在所做的将很好

如果您希望在分配ode.Products时避免执行数据库查询,则可以使用以下替代方法:

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

这速度更快,但可读性较差。此外,Products属性在加载之前将为null。但是对于插入,这通常是可以的。

另一种方法是使用存根对象而不是EntityKey,即

var product = new Product {ID = 2};
ctx.AttachTo("Products", product);
ode.Product = product;
作为一个额外的奖励,这段代码将来也将用于POCO对象


有关该技术的更多信息,请参阅。

我不知道你的意思。你期待什么样的捷径?你能更具体地说明你的需求吗?我想知道除了更新操作之外,我将如何执行与上面完全相同的操作。因为看起来我需要再次从数据库中执行查询以获取实体,然后更改属性(更改enityState),然后执行更新(SaveChanges),任何更简单/更简单的方法?没错。对于更新,必须先选择,然后保存。调用AcceptChanges,然后只更改一个属性,然后调用SaveChanges()如何?通过这种方式,我们可以避免select..我首先尝试了这一点,发现在调用ctx.SaveChanges()时,它甚至会尝试插入ProductsMassing
AddTo
。。。谢谢