我一整天都在試圖找出我應該如何處理這個問題。問題是,當我使用EF向數據庫添加「Reservation」實體時,它會向我不需要的表中添加一些不必要的內容。我不確定它的數據模型是否會導致問題。實體框架:添加實體到數據庫跳過添加到特定表
已經創建了一個看起來像這樣的數據模型:
有一個許多人預約,房間之間有很多關係。許多預訂只能容納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; }
}
聯繫人 :(已離開ou噸不必要屬性)
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();
這個測試數據應生成。問題是當我使用DataContext
中的Reservations.Add
添加預訂時,它會將新房間添加到Room
表格中。
我想要的只是更新預訂表,聯繫表和共享表,哪些房間在預訂上。
因此,如果預約房間101(ID 1)和房間102(ID 2),這些ID應該在共享表內使用。
由於某些原因,當我添加一個預訂並且預訂有一個ID = 1(房間101)的房間時,它會爲該房間添加一個新生成的ID(ID = 5,因爲表中已經有4個房間),它不應該這樣做。它也更新共享表並使用此ID = 5,它應該使用ID = 1。
試圖儘可能地解釋這一點,希望有人能告訴我我的下一步行動。美好的一天:)
你是否檢查了預訂的房間屬性是什麼調用'CreateReservation'什麼時候?是通過EF使用相同的DBContext加載的房間還是新的實例(例如,您在Reservation's Room集合中添加'New Room()')?您可能需要查看預訂的房間集合屬性並檢查其狀態(實體框架更改跟蹤狀態,如果它是新的,這可能會導致插入) –
感謝您的回覆。我會在發佈之前用我的工作更新帖子。 – Mikkel