更新在EF中添加关系行的行(多对多)

时间:2015-11-13 08:19:00

标签: c# .net entity-framework lambda

我有两个实体:FileVersionInfo.GetVersionInfo(ConfigurationManager.AppSettings["DllPathForBackUp"]).FileVersion; Order以及它们之间的多对多关系。我有一个接收ItemId作为参数的方法,如下所示:

Item

ItemSet表中有很多行,因此第一个查询很重。有没有一种方法可以将项目添加到订单中,而无需先在" ItemSet"上进行查询。表?我的意思是,我可以将ItemId直接添加到Order.Items或类似的东西吗?

2 个答案:

答案 0 :(得分:1)

        Item item = new Item { ID = ItemId };
        Order order = new Order { ID = OrderId };

        db.ItemSet.Attach(item);
        db.OrderSet.Attach(order);

        order.Items.Add(item);  

        db.SaveChanges();

请确保在Order类中有这个:

    public Order()
    {
        Items = new List<Item>();
    }

所以你不会在order.Items.Add(item);

中得到空指针异常

答案 1 :(得分:0)

所以你可以为实体建模,所以:

public DbSet<Item> ItemSet {get;set;}
public DbSet<Order> OrderSet {get;set;}
public DbSet<ItemOrder> ItemOrders {get;set;}

public class Item
{
    public int Id {get;set;}
}

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

public class ItemOrder
{
    [Key, Column(Order = 0)]
    public int ItemId {get;set;}

    [Key, Column(Order = 1)]
    public int OrderId {get;set;}
}

所以为了更新:

    public void AddItems(int OrderId, int ItemId)
    {
        var itemExists = db.ItemOrders.FirstOrDefault(x => x.OrderId == OrderId && x.ItemId == ItemId);

        if (itemExists != null) return;            

        db.ItemOrders.Add(new ItemOrder { OrderId = OrderId, ItemId = ItemId });

        db.SaveChanges();
    }

然后您可以使用LINQ .Join()进行查询,并且非常简单。

为了完整起见,OP提到导航属性现已消失。因此,如果您知道OrderId,那么您可以这么做:

var items = db.ItemOrders.GroupJoin(
                db.ItemSet,
                io => io.ItemId,
                i => i.Id,
                (itemOrder, items) => items)
              .ToList();

因此,为了引导您完成,GroupJoin会询问您要加入的IQueryable / IEnumerable数据。

第二个参数是初始数据集的字段,即您要加入的集合ItemOrders

第三个参数是正在加入的集合的字段,即ItemSet

fouth参数基本上是Select,其中会显示大约Func的{​​{1}}签名。

您可以将同样的逻辑应用于LINQ (ItemOrder itemInFirstSet, IEnumerable<Item> itemsThatAreJoined)扩展名。但不是Join而是itemsThatAreJoined。因此区别为itemThatIsJoined会找到多个匹配的实体,GroupJoin只会找到一个。

这不是详细解释,更多是概述