我有一個影院模型:
public class Cinema
{
public int Id { get; set; }
[Required]。
[StringLength(255)]
public string Name { get; set; }
[Required]。
public string Address { get; set; }
[Required]。
[Range(0, int.MaxValue, ErrorMessage = "請輸入有效數字")]
[Display(Name = "Total Seats")]
public int TotalSeatsNumber { get; set; }
public List<Seat> TotalSeats { get; set; }
public OpeningHour OpeningHour { get; set; }
[Required]
[Display(Name = "Opens At")]
public byte OpeningHourId { get; set; }
public ClosingHour ClosingHour { get; set; }
[Required]
[Display(Name = "Closes At")]
public byte ClosingHourId { get; set; }
public Cinema() { }
我有一個TotalSeatsNumber屬性,所以當管理員填寫表格(在網站內部)創建一個新的電影院時,他必須指定該電影院應包含多少個座位。
我還創建了一個名為TotalsSeats的座位串列,后來我試圖根據管理員選擇的座位數來初始化該串列中的座位。你可以在這里看到我想做的事情:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Save(Cinema cinema)
{
if (! ModelState.IsValid)
{
var viewModel = new CinemaFormViewModel(cinema)
{
OpeningHours = _context.OpeningHours.ToList(),
ClosingHours = _context.ClosingHours.ToList()
};
return View("CinemaForm", viewModel) 。
}
if (cinema.Id == 0)
{
cinema.TotalSeats = SetSeats(cinema.TotalSeatsNumber)。
_context.Cinemas.Add(cinema)。
}
else
{
var cinemaInDb = _context.Cinemas.Single(c => c.Id == cinema.Id);
cinemaInDb.Name = cinema.Name;
cinemaInDb.Address = cinema.Address;
cinemaInDb.TotalSeatsNumber = cinema.TotalSeatsNumber;
cinemaInDb.TotalSeats = cinema.TotalSeats;
cinemaInDb.OpeningHourId = cinema.OpeningHourId;
cinemaInDb.ClosingHourId = cinema.ClosingHourId。
}
_context.SaveChanges()。
return RedirectToAction("Index", "Cinemas") 。
}
SetSeats函式回傳一個Seats的串列,我初始化了它們的Id、位置和可用性。為了以防萬一,我將在這里添加我的座位模型和SetSeats函式:
public class Seat
{
public int Id { get; set; }
[]。
public string Location { get; set; }
[]。
public bool isAvailable { get; set; }
public Seat()?
{
isAvailable = true;
}
}
publicList< Seat> SetSeats(int totalSeatsNumber)。
{
List<Seat> totalSeats = new List<Seat>()。
char rowLetter = 'a'/span>;
int seatNumInRow = 1;
for (int i = 1; i <= totalSeatsNumber; i , seatNumInRow )
{
totalSeats.Add(new Seat() { Id = i, Location = rowLetter ("" seatNumInRow), isAvailable = true });
if ((i % 10) == 0)
{
rowLetter ;
seatNumInRow = 0;
}
}
return totalSeats;
}
我試圖這樣做的原因是,我希望用戶在訂購某家電影院的電影票時能夠選擇一個特定的座位。
問題是,當我嘗試 SaveChanges()時,它向我拋出了一個例外:
當我嘗試 SaveChanges()時,它向我拋出了一個例外
System.Data.Entity.Infrastructure.DbUpdateException:"在保存沒有為其關系暴露外鍵屬性的物體時發生錯誤。EntityEntries屬性將回傳null,因為無法確定單個物體為例外的來源。通過在你的物體型別中公開外鍵屬性,可以使保存時的例外處理更容易。詳情請見InnerException。'
當除錯時,我可以看到我的 "電影院 "實體被正確地更新了,就像我想要的那樣。但是當我試圖將它保存到 DB 時,它卻失敗了。
uj5u.com熱心網友回復:
你的Seat類與Cinema類沒有任何關系,但你試圖添加一個串列,所以添加一個外鍵CinemaId
。public class Seat { public int Id { get; set; } ...... public int CinemaId { get; set; } public virtual Cinema Cinema {get; set; } }改變之后,你必須遷移到資料庫中去
uj5u.com熱心網友回復:
你必須先進行遷移,以確保資料庫方案與你在C#中的DbModels同步進行。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/309876.html
標籤:
