Asp.net Linq到实体-删除/添加相关数据(多对多关系)

Asp.net Linq到实体-删除/添加相关数据(多对多关系),asp.net,asp.net-mvc,linq,entity-framework,entity-framework-5,Asp.net,Asp.net Mvc,Linq,Entity Framework,Entity Framework 5,我有位置-带有相关标签: 有一个地方模型: public virtual int PlaceID { get; set; } public virtual ICollection<Tag> Tags { get; set; } public virtual string Name { get; set; } 谢谢。只有当你知道你在做什么和为什么时,你才应该对实体的实体状态进行微观管理 在这种情况下,您应该将其控制权交给实体框架 db.Places.Attach(pl

我有位置-带有相关标签:

有一个地方模型:

public virtual int PlaceID { get; set; }
public virtual ICollection<Tag> Tags { get; set; }
public virtual string Name { get; set; }

谢谢。

只有当你知道你在做什么和为什么时,你才应该对实体的实体状态进行微观管理

在这种情况下,您应该将其控制权交给实体框架

        db.Places.Attach(place);
        context.Entry(place).Collection(p => p.Tags).Load();

        foreach(var tag in SelectedTags)
        {
            place.Tags.Add(tag);
        }            
        db.SaveChanges();

附加说明:您不能将导航属性
ICollection
更改为新集合。只能添加、删除和清除。如果要删除或清除此集合,请在之前从数据库加载。

谢谢-您所说的微观管理是什么意思?假设一个地方有两个标签‘cafe’和‘bar’——我想删除‘cafe’并添加‘restaurant’。我应该先清除所有标签,然后添加“酒吧”和“餐厅”吗?最好的方法是什么。微观管理是指手动将所有修改实体的EntityState更改为modified。2.如果我在你的位置,我将清除并添加酒吧和餐厅。我已经在“place.Tags.add(tag)”上实现了它,并得到了它:“对象引用未设置为对象的实例。”-但是,调试期间标记不是空的,这是由于未加载导航属性。你应该加载它。我更新了答案。谢谢-我现在明白了:类型“Place”上的属性“Tags”是一个集合导航属性。应使用收集方法而不是引用方法。
place.Tags = SelectedTags
db.Entry(ptvm.place).State = EntityState.Modified;
db.SaveChanges();
        db.Places.Attach(place);
        context.Entry(place).Collection(p => p.Tags).Load();

        foreach(var tag in SelectedTags)
        {
            place.Tags.Add(tag);
        }            
        db.SaveChanges();