![](/img/trans.png)
[英]Table not added to database when adding a new migration using entity framework 7
[英]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();
應用程序啟動時應生成此測試數據。 問題是當我使用DataContext
的Reservations.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.