2009-07-21 9 views
6
struktury

moim stole jest tonajlepsze praktyki/droga do głównego szczegół/multi tabeli wstawić 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 

Próbuję operacji insert przy użyciu Entity Framework przy użyciu kodu poniżej
Jest to najlepszy sposób zrobić wkładkę?
nie jestem zadowolony ze sposobu Dostaję pełną pozycję produktów z obiektu kontekstowego, zamiast być w stanie po prostu przypisać prosty wartość 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(); 
} 

Czy to jest prawidłowy sposób zrobić szczegół głównego wstawić czy istnieje lepszy/inny sposób.

+0

brakuje 'AddTo ' ... Dzięki! – nrod

Odpowiedz

2

To, co teraz robisz, będzie działało dobrze.

Jeśli chcesz uniknąć wykonując zapytanie do bazy danych podczas przypisywania ode.Products, następnie można użyć następującej alternatywy:

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

ta jest szybsza, ale mniej czytelny. Ponadto właściwość Produkty będzie miała wartość null, dopóki jej nie załadujesz. Ale w przypadku wkładki często jest to w porządku.

+0

Czy są jakieś skróty do aktualizacji danych szczegółowych wzorca? –

+0

Nie jestem pewien, co masz na myśli. Jakiego rodzaju skrótów oczekujesz? Czy możesz bardziej szczegółowo określić swoje potrzeby? –

+0

Chciałem wiedzieć, jak wykonać dokładnie tę samą akcję, którą wykonałem powyżej, ale dla operacji aktualizacji. –

1

Innym podejściem byłoby użyć Stub Przedmioty zamiast EntityKeys tj

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

itd. Jako dodatkowy bonus kod ten będzie działał z POCO sprzeciwia też w przyszłości.

Aby uzyskać więcej informacji na temat tej techniki, zobacz stronę this blog post.

+0

Próbowałem tego pierwszy i stwierdził, że podczas wywoływania ctx.SaveChanges() próbuje wstawić nawet produkty –