Best Practice / Weg für Master-Detail / Multitabelle Einfügen in Entity Framework

.net entity-framework linq linq-to-entities

Frage

Meine Tischstruktur ist dies

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

Ich versuche einen Einfügevorgang mit Entity Framework unter Verwendung des folgenden Codes
Ist dies der beste Weg, um die Einlage zu machen?
Ich bin nicht zufrieden damit, wie ich das vollständige Produkt vom Kontextobjekt bekomme, statt einfach einen einfachen productId-Wert zuweisen zu können

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();
}

Ist dies der richtige Weg, um das Master-Detail einzufügen, oder gibt es einen besseren / anderen Weg.

Akzeptierte Antwort

Was Sie jetzt tun, wird gut funktionieren.

Wenn Sie beim Zuweisen von ode.Products eine Datenbankabfrage vermeiden möchten, können Sie die folgende Alternative verwenden:

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

Dies ist schneller, aber weniger lesbar. Die Products-Eigenschaft ist auch null, bis Sie sie laden. Aber für einen Einsatz ist das oft OK.


Beliebte Antwort

Ein anderer Ansatz wäre die Verwendung von Stub-Objekten anstelle von EntityKeys

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

etc. Als zusätzlicher Bonus wird dieser Code in Zukunft auch mit POCO-Objekten funktionieren.

In diesem Blogeintrag finden Sie weitere Informationen zu dieser Technik.



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum