2014-12-10 1 views
2

Entity Framwork Code First 응용 프로그램을 만들고 목록에 엔터티를 두 번 이상 추가 할 때 문제가 발생합니다.Entity Framework - 목록에 두 번 이상 항목 추가

다음과 같은 두 클래스가 있는데, 다 대다 관계에 대해 서로를 참조합니다.

Orders 
- OrderId (PK, int) 

:

public class Order 
{ 

    public virtual List<OrderItem> OrderItems { get; set; } 

} 

public class OrderItem 
{ 

    public virtual List<Order> Orders{ get; set; } 

} 

내 데이터베이스에서 다음과 같은 세 개의 테이블을 생성합니다.

OrderItems 
- OrderItemId (PK, int) 

.

OrderOrderItems 
- Order_OrderId (PK,FK,int) 
- OrderItem_OrderItemId (PK,FK,int) 

는 코드에서, 나는 다음을 수행 할이이 데이터베이스에 지속됩니다 때

private void AddOrderItemsTest 
{ 
    OrderItem orderItem = GetOrderItem(); // gets an existing order item from the DB 
    var order = new Order(); 
    order.OrderItems.Add(orderItem); 
    order.OrderItems.Add(orderItem); // add the order item to the list a second time 
    context.Orders.Add(order); 
} 

는, 단 하나의 orderItem 개체가 목록에 추가됩니다. OrderOrderItems 테이블에서 OrderItem_OrderItemId는 PK이므로 고유해야합니다. 즉, EF는 같은 유형의 orderItem을 두 번 이상 목록에 추가 할 수 없도록 테이블을 디자인했습니다.

EF에 추가 할 수있는 데이터 주석이있어 동일한 유형의 항목을 두 개 이상 추가 할 수 있습니까?

+0

이 질문은 같은 질문을하는 것으로 보입니다. http://stackoverflow.com/questions/7191132/entity-framework-adding-the-same-entity-twice-in-many-to-many-relationships 그 질문 그래도 3 년이 지났으니 지금과 그 사이에 아무 것도 변하지 않았다고 확신하지 못하면 (지금 EF6에 있습니다.) 중복으로 표시하지 마십시오. –

+0

같은 항목을 컬렉션에 두 번 추가하는 목적은 무엇입니까? 테이블에 저장된 데이터를 어떻게 예상합니까? * OrderOrderItems *의 중복 된 여러 행 또는 * OrderItems * 및 * OrderOrderItems *의 두 개의 별개 레코드 – Vladimirs

+0

@Vladimirs 고객이 동일한 항목을 두 개 구입하려고하는 경우 목록에 두 번 추가합니다. 'OrderOrderItems' 테이블에 두 개의 중복 된 행이 생길 것으로 기대하지만, 실제로 EF가 어떻게 구현하는지 신경 쓰지 않습니다! –

답변

1

귀하의 주문에서 (동일한 품목의) 물품 수를 올바르게 처리하는 방법이 아니라고 생각합니다. OrderItems 컬렉션에 10000 개의 중복 항목이로드되기를 정말로 원하십니까? 나는 그렇지 않다. Amount을 도입하여

public class OrderItemDetails 
{ 
    public int OrderItemDetailsId { get; set; } 
    public int OrderId { get; set; } 
    public int OrderItemId { get; set; } 
    public int Amount{ get; set; } 

    public virtual Order Order { get; set; } 
    public virtual OrderItem OrderItem { get; set; } 
} 

public class Order 
{ 
    public virtual List<OrderItemDetails> OrderItemDetails { get; set; } 
} 

public class OrderItem 
{ 
    public virtual List<OrderItemDetails> OrderItemDetails { get; set; } 
} 

그리고 당신이 행복하지 않은 경우 여전히 중복 항목을 갖고 싶어 :

당신은 따라서 OrderItemOrder 당을 포함하는 새로운 기업을 소개하는 것이 좋습니다, OrderOrderItems 테이블에 다른 기본 키가 필요합니다 많은 관계의 기본 키가 OrderIdOrderItemId이지만 OrderItemDetailsId이 아니기 때문에 각 항목 인스턴스 당 절대적으로 괜찮을 것입니다.

+0

당신은 그 자리에 있습니다 - 그렇게하는 것이 훨씬 더 좋은 방법입니다. 감사. –

+0

이것은 또한 OrderItem의 '고정 된'복사본을 저장하기에 좋은 곳을 설정하여 도로 아래의 가격 등의 변화를 관리합니다. –

관련 문제