2

我的地方 - 与相关标签:LINQ到实体 - 删除/添加相关的数据(多对多的关系)

有地点模型:

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

和相关标签型号:

public virtual int TagID { get; set; } 
public virtual string Name { get; set; } 
public virtual string NamePlural { get; set; } 
public virtual ICollection<Place> Places { get; set; } 

多对多的关系。

因此,例如 - 一个地方可以有一个'酒吧'和'咖啡厅'的标签。 (许多地方也可能有这些标签)。

我可以添加相关标签的地方很好。但是,如何操作与Linq相关的标签呢? (添加/删除/编辑)。

另外 - 如果我尝试保存地点模型,并添加相关标记 - 地点已更新但不是标记 - 我怎么能这样做?

place.Tags = SelectedTags 
db.Entry(ptvm.place).State = EntityState.Modified; 
db.SaveChanges(); 

谢谢。

回答

3

只有当你知道自己在做什么和为什么做时,你才应该对实体的实体状态使用微管理。

在这种情况下,您应该将其控制到实体框架。

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

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

附加说明:您不能导航属性ICollection更改为新的集合。您只能添加,删除和清除。如果你想删除或清除这个集合,你应该在数据库之前加载它。

+0

谢谢 - 你是什么意思的微观管理?假设一个地方有2个标签'cafe'和'bar' - 我想删除'cafe'并添加'restaurant'。我应该先清除所有标签,然后添加“酒吧”和“餐厅”?什么是最好的方式来做到这一点? – niico

+0

1.微观管理是指您手动更改EntityState以修改所有修改的实体。 2.如果我在哪里,我会清除并添加酒吧和餐厅。 –

+0

我已经实现了它,并通过'place.Tags.Add(tag):“将对象引用设置为对象的实例。 - 但是在调试期间标记ISNT null – niico