簡體   English   中英

使用一對多關系實體列表的屬性更新db上的實體

[英]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對象定義一個組合鍵,該組合鍵由IdHouseID

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM