Отключает ли метод EntitySet Detach дочерние объекты - PullRequest
1 голос
/ 07 декабря 2011

Учитывая этот пример, кажется, что отсоединение объекта от его EntitySet не отсоединяет все дочерние сущности, как объявлено .

Вот модель:

public class Order
{
    [Key]
    public int Id { get; set; }
    public string OrderData { get; set; }

    [Include]
    [Association("Order_OrderDetail", "Id", "Order_Id")]
    public IEnumerable<OrderDetails> Details { get; set; }
}
public class OrderDetails
{
    [Key]
    public int Id { get; set; }
    public int Order_Id { get; set; }
    public String OrderDetailData { get; set; }
}

Вот DomainService:

public IQueryable<Order> GetOrders()
{
    var orders = new[] { 
        new Order { Id = 1, OrderData="Order 1", 
            Details = new [] 
            {
                new OrderDetails { Id=1, Order_Id=1, OrderDetailData="Order 1 Detail 1"},
                new OrderDetails { Id=2, Order_Id=1, OrderDetailData="Order 1 Detail 2"},
                new OrderDetails { Id=3, Order_Id=1, OrderDetailData="Order 1 Detail 3"},
            }
        },
        new Order { Id = 2, OrderData="Order 2", 
            Details = new [] 
            {
                new OrderDetails { Id=4, Order_Id=2, OrderDetailData="Order 2 Detail 1"},
                new OrderDetails { Id=5, Order_Id=2, OrderDetailData="Order 2 Detail 2"},
                new OrderDetails { Id=6, Order_Id=2, OrderDetailData="Order 2 Detail 3"},
            }
        }};

    return orders.AsQueryable();
}

public IQueryable<OrderDetails> GetOrderDetails()
{
    throw new NotImplementedException();
}

И, наконец, вот методы на стороне клиента, которые демонстрируют проблему:

    private OrderContext LocalContext;
    public MainPageViewModel()
    {
        if (!IsInDesignMode)
        {
            LocalContext = new OrderContext();
            LocalContext.Load(LocalContext.GetOrdersQuery());
            Orders = new PagedCollectionView(LocalContext.Orders);
            DetachCommand = new RelayCommand<Order>(DetachAction);
        }
    }

    public RelayCommand<Order> DetachCommand { get; private set; }
    private void DetachAction(Order source)
    {
        try
        {
            LocalContext.Orders.Detach(source);
            var newContext = new OrderContext();
            newContext.Orders.Attach(source);
        }
        catch (Exception exception)
        {
            MessageBox.Show(exception.Message);
        }
    }

Когда метод DetachAction вызывается, он успешно отсоединяет экземпляр, который был передан в, но выдает исключение при попытке присоединить экземпляр к другому DomainContext.Исключением является: сущность OrderDetails: 1 не может быть присоединена к этому EntityContainer, поскольку она уже присоединена к другому EntityContainer.

Возможно, я не понимаю, что означает документация, когда в нем говорится: Еслисущность является корнем композиционной иерархии, все дочерние сущности также будут отсоединены Не является ли Орден, который был отсоединен, корнем композиционной иерархии?

1 Ответ

1 голос
/ 08 декабря 2011

Я думаю, что ключ к проблеме - неправильное понимание документации:

Если сущность является корнем композиционной иерархии

Ваша Details собственность не является композиционной. Однако вы можете легко сделать это, добавив атрибут '[Composition] `:

[Include]
[Association("Order_OrderDetail", "Id", "Order_Id")]
[Composition]
public IEnumerable<OrderDetails> Details { get; set; }
...