簡體   English   中英

實體框架:將實體添加到數據庫中跳過添加到特定表

[英]Entity Framework : add entity to database skip added to specific table

我已經整日試圖找出該問題該怎么辦。 問題是,當我使用EF向數據庫添加“保留”實體時,它向我不需要的表之一添加了不必要的內容。 我不確定是否是我的數據模型引起了問題。

創建了一個如下所示的數據模型:

在此處輸入圖片說明

預訂和房間之間存在多對多關系。 許多預訂只能容納1位聯系人。

我的模型如下所示:

保留 :(已省略不必要的屬性)

public class Reservation
{
    public int ReservationID { get; set; }
    public int ContactPersonID { get; set; }

    public virtual ContactPerson ContactPerson { get; set; }
    public virtual ICollection<Room> Room { get; set; }

    public Reservation()
    {
        Room = new List<Room>();
        ContactPerson = new ContactPerson();
    }
}

房間 :(已刪除不必要的屬性)

public class Room
{
    public int ID { get; set; }
    public string RoomNumber { get; set; }

    public virtual ICollection<Reservation> Reservations { get; set; }
}

ContactPerson :(已省略不必要的屬性)

public class ContactPerson
{
    public int ContactPersonID { get; set; }

    public virtual ICollection<Reservation> Reservations { get; set; }
}

然后,我創建了一個DataContext類,如下所示:

public class DataContext : DbContext, IDataContext
{
    public DataContext() : base("DataContext")
    {
    }

    // DbSet to bookings
    public DbSet<Reservation> Reservations { get; set; }
    public DbSet<ContactPerson> ContactPersons { get; set; }
    public DbSet<Room> Rooms { get; set; }

    public void MarkAsModified(Reservation item)
    {
        Entry(item).State = EntityState.Modified;
    }

    public void CreateReservation(Reservation item)
    {
        Reservations.Add(item);
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();

        modelBuilder.Entity<Reservation>()
            .HasMany(c => c.Room).WithMany(i => i.Reservations)
            .Map(t => t.MapLeftKey("ReservationID")
            .MapRightKey("RoomID")
            .ToTable("RoomReservation"));
    }
}

由於房間和預訂之間存在多對多關系,因此將創建一個共享表。

我已經為應用程序創建了一些測試數據,並使用遷移更新了數據庫。 Room模型應在酒店中創建一個房間表,如下所示:

 var rooms = new List<Room>
        {
            new Room {RoomNumber = "101", Beds = 1, RoomType = RoomTypeEnum.Single, Minibar = true, Occupied = true, Smoking = false},
            new Room {RoomNumber = "102", Beds = 1, RoomType = RoomTypeEnum.Single, Minibar = true, Occupied = true, Smoking = false},
            new Room {RoomNumber = "103", Beds = 1, RoomType = RoomTypeEnum.Single, Minibar = true, Occupied = false, Smoking = false},
            new Room {RoomNumber = "104", Beds = 2, RoomType = RoomTypeEnum.Double, Minibar = true, Occupied = false, Smoking = true},             
        };

rooms.ForEach(b => context.Rooms.AddOrUpdate(b));
context.SaveChanges();

應用程序啟動時應生成此測試數據。 問題是當我使用DataContextReservations.Add添加預訂時,它將新房間添加到Room表中。

我想要的只是更新預訂表,聯系人表和預訂表上的哪些房間的共享表。

因此,如果預訂包含房間101(ID 1)和房間102(ID 2),則應在共享表中使用這些ID。

由於某種原因,當我添加一個預訂並且預訂中有一個ID = 1的房間(101房間)時,它將為這個房間添加一個新生成的ID(ID = 5,因為表中已經有4個房間),不應該這樣做。 它還會更新共享表並使用此ID = 5,在該情況下本應使用ID = 1。

試圖盡力解釋這一點,希望有人能告訴我我的下一步。 美好的一天 :)

快速瀏覽,我注意到您的模型非常復雜。 您真的將屬性從“房間和客戶”導航到“預定”嗎?

復雜對象圖的寫(添加,更新,刪除)操作是實體框架中的一個難題,尤其是當對象斷開連接時。

簡化您的模型,並從“房間”和“客戶”中刪除“ ICollection預訂”。

向您的數據訪問層添加其他方法,以按房間和客戶獲取預訂。

找到了引起問題的問題。 正如伯恩哈德·基切爾(Bernhard Kircher)那種對我解釋的那樣,上下文有問題。

通過獲取所有房間的列表來解決此問題,對其進行過濾,以便只有選中的房間可以在列表中。

將該列表添加到預訂中。 一些它是如何工作的,所以我猜想關於狀態。

public bool Execute(Reservation reservation)
    {
        //Add correct rooms to reservation;
        List<Room> roomsEntities = new List<Room>();

        foreach (var room in reservation.Room)
        {
            var roomsFound = _db.Rooms.Where(r => r.ID == room.ID).ToList();

            foreach (var ro in roomsFound)
            {
                roomsEntities.Add(ro);
            }
        }

        //Add correct rooms to entity.
        reservation.Room = roomsEntities;

        try
        {
            _db.CreateReservation(reservation);
            _db.SaveChanges();
        }
        catch (Exception e)
        {
            return false;
        }

        return true;
    }

為其他外觀添加了代碼,將遇到同樣的問題:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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