【问题标题】:Updating an entity with ICollection navigation property using EF 4.1 code first首先使用 EF 4.1 代码更新具有 ICollection 导航属性的实体
【发布时间】:2011-10-24 17:47:15
【问题描述】:

我首先使用 EF 4.1 代码并且在更新 Order 实体时遇到问题,当现有实体包含 OrderList 的非空集合并且用户删除了一些现有的并添加了新的订单列表时。

我有如下所示的域模型

public class Order
{
    public int Id { get; set;
    public string Name { get; set;}

    public ICollection<OrderList> OrderLists { get; set;}
}

public class OrderList
{
    public int Id { get; set;}
    public int OrderId { get; set;}
    public string ItemDescription { get; set;}
    public decimal Price { get; set;}

    public virtual Order Order { get; set;}
}

这是我用于更新订单实体的代码。

using (var context = new MyDbContext())
{
    var order = context.Orders
                        .Include("OrderLists")
                        .FirstOrDefault(o => o.Id == orderId);

    order.Name = "New name"; // this gets saved
    order.OrderLists.Clear(); // Does not delete the existing order list items
    order.OrderLists = new List<OrderList> { new OrderList { OrderId = order.Id, ItemDescription = "New Item" } };  // Does not create new list

    context.Orders.Attach(order);
    context.Entry<Order>(order).State = System.Data.EntityState.Modified;
    context.ChangeTracker.DetectChanges();
    context.SaveChanges();
}

请指导我如何首先使用 EF 4.1 代码实现这一目标?

谢谢 大师

【问题讨论】:

    标签: entity-framework ef-code-first


    【解决方案1】:

    这应该可以解决问题:

    var order = context.Orders
                        .Include("OrderLists")
                        .FirstOrDefault(o => o.Id == orderId);
    order.Name = "New name"; // this gets saved
    
    foreach (var orderlist in order.OrderLists.ToList())
    {
        context.OrderLists.Remove(orderlist);
    }
    
    order.OrderLists.Clear();                 
    
    order.OrderLists.Add(new OrderList { Id = order.Id, ItemDescription = "New Item" });
    
    context.SaveChanges();
    

    您需要单独删除orderlist项目,然后清除集合。

    【讨论】:

    • 谢谢沃特。这可以通过存储库模式来实现吗?我正在访问多个实体(在本例中为 context.Orders 和 context.OrderLists)。 Order 实体中可能还有更多 ICollection 项?
    • 如果您想以通用方式清除所有收集项,您可以查看反射,但我认为“清除此实体的所有收集项”功能会有点危险 :) 你加载通用实体时还必须包含所有集合,这可能意味着加载整个数据库。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多