2009-07-21 2 views
6

Meine Tabellenstruktur ist diesbest practice/Weg für Master-Detail/multi Tabelle einfügen in 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 

ich auf einen Einsatz Betrieb versuchen Entity Framework mit dem Code unter
Ist dies der beste Weg, den Einsatz machen?
Ich bin nicht zufrieden mit der Art und Weise bin ich das gesamte Produkt aus dem Kontext Objekt bekommen, anstatt der Lage zu sein, nur einen einfachen productId Wert zuweisen

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 die Master-Detail zu tun einfügen oder gibt es einen besseren/anderen Weg.

+0

fehlt 'AddTo ' ... Danke! – nrod

Antwort

2

Was Sie jetzt tun, wird gut funktionieren.

Wenn Sie eine Datenbankabfrage zu tun vermeiden möchten, wenn ode.Products zuweisen, dann 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. Außerdem wird die Products-Eigenschaft null sein, bis Sie es laden. Aber für einen Einsatz ist das oft in Ordnung.

+0

Und gibt es Verknüpfungen zum Aktualisieren von Master-Detaildaten? –

+0

Ich bin mir nicht sicher, was du meinst. Welche Art von Abkürzungen erwarten Sie? Können Sie genauer auf Ihre Bedürfnisse eingehen? –

+0

Ich wollte wissen, wie ich genau die oben beschriebene Aktion ausführen würde, aber für einen Aktualisierungsvorgang. –

1

Ein anderer Ansatz wäre Stub zu verwenden Objekte statt EntityKeys heißt

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

usw. Als zusätzlichen Bonus dieser Code mit POCO arbeiten auch in Zukunft Objekte.

Weitere Informationen zu dieser Technik finden Sie unter this blog post.

+0

Ich versuchte dies zuerst und fand, dass beim Aufruf von ctx.SaveChanges() versucht, sogar die Produkte einzufügen –

Verwandte Themen