使用多对多关系实体框架进行更新

时间:2014-11-30 06:30:28

标签: c# asp.net-mvc entity-framework entity-framework-6 repository-pattern

我有一个实体对象Item

public partial class Item : Entity 
{
    public int   ItemId { get; set; }
    ....
    public virtual IList<ItemStandard> Standards { get; set; }

}

我有ItemStandardItemstandard可以属于许多Item,而Item可以有很多ItemStandard

public partial class ItemStandard : Entity
{
    public int ItemStandardId { get; set; }
    ....
    public virtual IList<Item> Items { get; set; }
    public ItemStandardGroup ItemStandardGroup { get; set; }
}

我遗漏了这些物品的微不足道的部分。这是我的映射:

public class ItemMapping : EntityTypeConfiguration<Item>
{
    public ItemMapping()
    {
        HasMany(t => t.Standards)
            .WithMany(t => t.Items)
            .Map(m =>
            {
                m.ToTable("ItemStandardRelationShip");
                m.MapLeftKey("ItemId");
                m.MapRightKey("ItemStandardId");
            });
    }
}

当我从上下文中检索对象时,如果工作正常 - 如果我这样做

  context.Item.FirstOrDefault(x => x.ItemId == whatever);

它将返回属性标准中的所有ItemStandard,就像它想象的那样。

现在,我尝试做这样的更新:

    public Item SaveItem(Item item, int[] Standards)
    {          
        foreach (var a in Standards)
        {
            var newStandard = _context.ItemStandard.FirstOrDefault(x => x.ItemStandardId == a);
                item.Standards.Add(newStandard);

        }
        _context.Item.Attach(item);
        _context.Entry(item).State = EntityState.Modified;
        _context.SaveChanges();
        return _context.Item.FirstOrDefault(x => x.ItemId == item.ItemId);
    }

您可以看到如何而不是返回我保存的对象,而不是从数据库中调用另一个SELECT以确保保存发生。当我在调试器中停止它时,我看到一切正常。新的ItemStandard附加到项目,如果我进入每个ItemStandard,现在新项目的新Item属性。

之后我进入数据库时​​,我的ItemStandardRelationShip表中没有任何更改。就好比什么都没发生过。上下文设置得很好,每个存储库中的其他所有内容都能正常工作。谁知道我做错了什么?

1 个答案:

答案 0 :(得分:0)

事实证明,我猜,我读过的所有教程都是错的。您必须在受影响的两个对象中实际设置更改

     foreach (var a in Standards)
    {
        var newStandard = _context.ItemStandard.FirstOrDefault(x => x.ItemStandardId == a);
        newStandard.Items.Add(item);
            item.Standards.Add(newStandard);

    }