![](/img/trans.png)
[英]List of entities not remembering previously added entities for a one-to-many relationship
[英]Update entity on db with a property of list of entities with one-to-many relationship
我將組成一些更簡單的實體以獲得更好的理解:
public class Room
{
[Required]
public int Id { get; set; }
[Required]
public int Name { get; set; }
[Required]
[Column("House_Id")]
public int HouseId { get; set; }
public virtual House House { get; set; }
}
public class House
{
[Required]
public int Id{ get; set; }
public string Name { get; set; }
public virtual ICollection<Room> Rooms { get; set; }
}
現在,可以說,我在數據庫中有一個與4個房間相關的眾議院實體。 我要更新房屋並刪除其2個房間。 我正在使用Asp.Net MVC4 btw。
var house = HouseRepository.Get(id);
house.Name = model.Name; // Some string
house.Name = model.Rooms; // ICollection<Room> from view with 2 rooms in it, cuz user deleted other two in view
HouseRepository.SaveChanges();
return house;
發生的是,我得到一條錯誤消息:操作失敗:由於一個或多個外鍵屬性不可為空,因此無法更改關系。 對關系進行更改時,相關的外鍵屬性將設置為空值。 如果外鍵不支持空值,則必須定義新的關系,必須為外鍵屬性分配另一個非空值,或者必須刪除不相關的對象。
我需要找到一個解決方案,如何從數據庫中刪除不相關的房間。 我應該在何時何地進行操作? 我已經嘗試過一些東西,但是現在即使添加房間,也會出現該錯誤。
是否有任何簡單的方法告訴EF它應自行刪除這些房間?
EF僅在您使用識別關系的情況下才能自動刪除孤兒。 您需要為Room
對象定義一個組合鍵,該組合鍵由Id
和HouseID
。
modelbuilder.Entity<Room>()
.HasKey(o => new { o.ID, o.HouseId });
modelbuilder.Entity<Room>()
.Property(o => o.ID)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
通過這種配置,EF知道,當您從“ Rooms
集合中刪除房間對象時,也可以安全地為數據庫刪除房間。
刪除不再需要的房間,以從模型中顯式刪除它們-等效於以下操作:
foreach(Room room in house.Rooms.ToList())
{
if(model.Rooms.FirstOrDefault(x=>x.Id == room.Id) == null)
dbContext.Rooms.Remove(room); //assumes the room is attached to your context, you may need to do a get
}
假設您設置的1所房屋當前有4個與之關聯的房屋,那么這應該可以進行:
var db = new TestContext();
var house = db.Houses.Include("Rooms").First();
// Grab rooms 2 & 3 for removal
var roomsToRemove = house.Rooms.OrderBy(r => r.Id).Skip(1).Take(2).ToList();
roomsToRemove.ForEach(r => db.Rooms.Remove(r));
db.SaveChanges();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.