如何洗掉訂單而不出現此例外?
UserLicenses參考文獻SerialOnOrderDetails,反之亦然:
DELETE 陳述句與 REFERENCE 約束“FK_SerialsOnOrderDetail_UserLicenses”沖突。沖突發生在資料庫“sales”、表“dbo.SerialsOnOrderDetail”、“UserLicenseId”列中。
洗掉確認的控制器動作代碼:
[Authorize(Roles = "admin")]
[HttpPost, ActionName("Delete")]
public async Task<ActionResult> DeleteConfirmed(int id)
{
Order order = GetOrderById(id);
if (order.UserLicenses.Count > 0)
{
context.UserLicenses.RemoveRange(order.UserLicenses);
}
if (order.SerialsOnOrderDetails.Count > 0)
{
context.SerialsOnOrderDetails.RemoveRange(order.SerialsOnOrderDetails);
}
context.Orders.Remove(order);
context.SaveChanges(); // Exception here !!!
}
[編輯] 添加了實時資料
實時資料(Id = UserLicenseId):

附加課程:
public partial class UserLicense
{
public string Id { get; set; }
public int OrderId { get; set; }
public string ProductId { get; set; }
public int CustomerId { get; set; }
public string AssignedUserId { get; set; }
public bool IsActive { get; set; }
public virtual AspNetUser AspNetUser { get; set; }
public virtual Customer Customer { get; set; }
public virtual Order Order { get; set; }
public virtual Product Product { get; set; }
public virtual ICollection<SerialsOnOrderDetail> SerialsOnOrderDetails { get; set; }
}
public partial class SerialsOnOrderDetail
{
public int orderID { get; set; }
public string serial { get; set; }
public string productID { get; set; }
public string UserLicenseId { get; set; }
public int customerID { get; set; }
public virtual Product Product { get; set; }
public virtual Serial Serial1 { get; set; }
public virtual Order Order { get; set; }
public virtual UserLicense UserLicense { get; set; }
public virtual Customer Customer { get; set; }
}
public partial class Order
{
public Order()
{
this.OrderDetails = new HashSet<OrderDetail>();
this.SerialsOnOrderDetails = new HashSet<SerialsOnOrderDetail>();
this.UserLicenses = new HashSet<UserLicense>();
}
public int orderID { get; set; }
public int customerID { get; set; }
public string promoCodeID { get; set; }
public System.DateTime date { get; set; }
public Nullable<int> resellerID { get; set; }
public string invoiceID { get; set; }
public string poNumber { get; set; }
public Nullable<System.DateTime> paymentDate { get; set; }
public Nullable<bool> validated { get; set; }
public string resellerOrderID { get; set; }
public Nullable<int> parentOrderID { get; set; }
public int months { get; set; }
public virtual Customer Customer { get; set; }
public virtual ICollection<OrderDetail> OrderDetails { get; set; }
public virtual PromoCode PromoCode { get; set; }
public virtual Reseller Reseller { get; set; }
public virtual ICollection<SerialsOnOrderDetail> SerialsOnOrderDetails { get; set; }
public virtual Order ParentOrder { get; set; }
public virtual ICollection<UserLicense> UserLicenses { get; set; }
}
uj5u.com熱心網友回復:
您是否驗證了 UserLicenses 和 SerialsOnOrderDetails 集合是否已正確加載且不為空?你確定 removerange 是正確的方法嗎?如果你不習慣,我建議你閱讀一些關于 EF 的教程。
也許您必須使用 .Include("....") 指令更新 GetOrderById 以加載這些集合,或手動加載相關專案。
uj5u.com熱心網友回復:
您參考的約束訊息來自底層 SQL Server。這不是 EF 錯誤,而是通過了。
當我在 TSQL 中遇到此類問題時,解決方案通常是在單個事務中洗掉兩個相互參考的行。
雖然我對 EF 不是很熟悉,但快速搜索會發現這個將多個操作放入單個事務背景關系的示例,而不是每個操作的單個事務的默認行為。
{
context.Database.Log = Console.WriteLine;
using (DbContextTransaction transaction = context.Database.BeginTransaction())
{
try
{
Author author1 = new Author() { Name = "Mark" };
Author author2 = new Author() { Name = "John" };
context.Authors.Add(author1);
context.SaveChanges();
context.Authors.Add(author2);
context.SaveChanges();
transaction.Commit();
}
catch (Exception ex)
{
transaction.Rollback();
}
}
}
我注意到另一位受訪者描述了其他可能有誤的事情。完全有可能我們都是對的,有很多問題需要解決。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/367389.html
標籤:C# asp.net-mvc 实体框架
