主細節/多表的最佳實踐/方式在實體框架中插入

.net entity-framework linq 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();
}

這是執行主細節插入的正確方法還是有更好/另一種方式。

一般承認的答案

你現在正在做的事情會很好。

如果您想在分配ode.Products時避免執行數據庫查詢,那麼您可以使用以下替代方法:

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

這更快,但可讀性更低。此外,在您加載它之前,Products屬性將為null。但對於插入,這通常是好的。


熱門答案

另一種方法是使用Stub Objects而不是EntityKeys ie

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

作為額外的獎勵,此代碼將來也將與POCO對像一起使用。

有關技術的更多信息,請參閱此博客文章



許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因