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