2011-04-28 7 views
0

엔티티 프레임 워크 4, WCF 및 Silverlight를 사용하고 있습니다.기존 하위 항목과 함께 새 개체를 추가하면 중복됩니다.

제품과의 많은 관계가 있습니다.

[Order]*--*[Product] 

먼저 모델을 사용하면 Entity Framework에서 자동으로 조인 테이블을 만듭니다. 서버 측에서 모든 것을 만들면 모든 것이 잘됩니다. Silverlight를 사용할 때 문제가 발생합니다.

제품 목록을 가져 와서 화면에 표시합니다. 사용자가 새 주문을 만들고 주문을 분리해야하는 제품을 선택합니다. 그런 다음 WCF에 제출됩니다. 서버 측에

var order = new order(); 
order.CustomerName = customerTextBox.Text; 
... 
order.Products = new ObservableCollection<Product>(); 

foreach (var product in selectedProducts) 
{ 
    order.Products.Add(product); 
} 
var proxy = new OrderService(); 
proxy.CreateOrderAsync(order); 

, 그것은

var db = new Model1Container(); 
db.Products.AddObject(order); 
db.SaveChanges(); 

그러나 뭔가 이상한 일이 그냥 아주 간단한 추가 방법입니다. 이것이 저장되면 데이터베이스의 거의 모든 것이 몇 번 복제됩니다. 내 생각 엔 Entity Framework가 순환 링크를 몇 번 통과하기 때문입니다.

db.Categories.Attatch (order)로 변경해 보았습니다. 그러나 이로 인해 아무 것도 구원받지 못했습니다. 주문을 저장하기 전에 반복적으로 각 제품을 수동으로 연결해 보았습니다. 그러나 객체가 이미 컨텍스트에 첨부되어 있다는 것을 나타내는 예외가 발생합니다.


편집 :는이 제품이 중복되는 것을 중지 수행. 그러나 테이블의 모든 주문은 여전히 ​​복제됩니다. 아직도 모든 관계를 횡단하고 있어야합니까?

db.Orders.AddObject(order); 
db.ObjectStateManager.ChangeObjectState(order, EntityState.Added); 

foreach (var product in order.Products) 
{ 
    db.ObjectStateManager.ChangeObjectState(product, EntityState.Unchanged); 
} 

db.SaveChanges(); 

답변

1

대신을 시도해보십시오

var db = new Model1Container(); 
db.Categories.Attach(order); 
db.ObjectStateManager.ChangeObjectState(order, EntityState.Added); 
db.SaveChanges(); 

문제는 그 AddObject 삽입 객체 그래프의 모든 추적되지 개체. EF를 사용할 때 명시 적으로 EF에 무엇이 변경되었는지 말해야합니다. 사용자가 주문을 수정할 수있게하면 여전히 have problems이됩니다.

+0

아무 것도 적용하지 않았습니다. Order와 Product 테이블의 모든 내용은 여전히 ​​중복되어 있습니다. –

+0

내가 제안한 것을 취하여 조금 확장했습니다. 이제는 제품이 복제되지 않지만 테이블의 모든 주문은 여전히 ​​복제됩니다. db.Orders.AddObject (order); db.ObjectStateManager.ChangeObjectState (order, EntityState.Added); foreach (순서대로 변수가있는 제품) { db.ObjectStateManager.ChangeObjectState (product, EntityState.Unchanged); } db.SaveChanges(); –

+0

모든 주문은 무엇을 의미합니까?단일 주문을 삽입 하시겠습니까? –

0

WCF RIA를 사용하고 있습니까? 그렇지 않은 경우 고려해야합니다. DomainServices는 많은 어려움을 겪습니다.

또한 'order_position'테이블을 만들지 않으시겠습니까? 이처럼 당신은 더 이상 많은 관계를 가질 필요가 없습니다. 하나의 order_position에는 하나의 주문과 하나의 제품 만 있습니다. 또한 가격을 지정하여 통계에 사용하기 위해 저장하게 할 수 있습니다 (제품 A의 금액을보고 싶지만 데이터베이스에서 가격을 몇 번 변경 한 경우에는 어떻게됩니까?).

+0

다른 모든 시나리오에서는 RIA를 사용합니다. 이 경우에는 그것을 사용해야합니다. 또한 Entity Framework는 이미 커버 아래에 조인 테이블을 생성하므로 실제로는 다 대다 관계가 아닙니다. 그리고 네, 조인 테이블에 수량 등이 없다는 한계를 알고 있습니다. 단순화를 위해 표를 제품/주문으로 변경했습니다. –

+0

확인. 어쨌든 order_position 테이블을 사용하는 이유는 이러한 문제가 실제로 쉽게 일어나고 프로그램이 확장 가능하다는 것입니다. 다음과 같이하면됩니다 : Context = new Model1DomainContext(); 주문 = 새 주문(); Context.orders.Add (order); ... foreach (제품 내의 var) { product.Order = order; Context.products.Add (order); } var submitOperation = Context.SubmitChanges(); submitOperation.Completed + = ... – LueTm

+0

이것은 실제로 Entity Framework에서 쉽게 수행 할 수있는 방법을 보여주기 전에 수행 할 수있는 방법을 사람들에게 시연하는 매우 구체적인 예입니다. –

관련 문제