Я получаю следующую ошибку при попытке вставить объект в дочернюю коллекцию после того, как модельное связующее создало модель, детей и внуков, а затем с помощью контекста .SaveChanges() ;Entity Framework 6 имеет множественность 1 или 0..1
Нарушение множественности. Роль «OrderDetail_OrderDetailPricelistProductOptions_Source» отношения «PPLib.Models.OrderDetail_OrderDetailPricelistProductOptions» имеет множественность 1 или 0..1.
Мои модели следующие (удаленные свойства для краткости);
public class Order
{
public int OrderId { get; set; }
public virtual List<OrderDetail> OrderDetails { get; set; }
}
public class OrderDetail
{
public int OrderDetailId { get; set; }
public int OrderId { get; set; }
public int ProductId { get; set; }
public virtual Product Product { get; set; } //FK NAV
public int? PricelistProductId { get; set; } // if a subscriber order ...has the ProductId from a PriceList.
private decimal _Price = 0;
public decimal Price { get { return _Price; } set { _Price = value; } }
private int _Quantity = 1;
public int Quantity { get { return _Quantity; } set { _Quantity = value; } }
public virtual List<OrderDetailPricelistProductOption> OrderDetailPricelistProductOptions { get; set; }
}
public class OrderDetailPricelistProductOption
{
public int OrderDetailPricelistProductOptionId { get; set; }
public int OrderDetailId { get; set; }
public virtual List<OrderDetailPricelistProductOptionsDetail> OrderDetailPricelistProductOptionsDetails { get; set; }
}
public class OrderDetailPricelistProductOptionsDetail
{
public int OrderDetailPricelistProductOptionsDetailId { get; set; }
public int OrderDetailPricelistProductOptionId { get; set; }
public string Name { get; set; }
}
Чтобы яснее:
Если я представить совершенно новый порядок, со списком OrderDetails, его список OrderDetailPricelistProductOptions и его список OrderDetailPricelistProductOptionsDetails, модель связующий делают свою работу, и я не получаю никакой ошибки делать:
db.Orders.Add(order);
db.SaveChanges();
Если я подам Редактировать с и существующий порядок и новый список OrderDetails, его список OrderDetailPricelistProductOptions и его список OrderDetailPricelistProductOptionsDetails, я получаю заказ от D контекст B, а затем объединить ORDERDETAILS из модели представления, используя:
order.OrderDetails.AddRange(pricelistProductVM.Order.OrderDetails);
и я не получаю никакой ошибки делает:
db.Entry(order).State = EntityState.Modified;
db.SaveChanges();
У меня есть особое положение, в котором я должен создать экземпляр нового OrderDetail под названием autoFillOd, и введите свои значения из одного из существующих OrderDetails, собранных в Binding Model. Меняю его количество значение, а затем добавить его в коллекцию OrderDetails в ViewModel, например, так:
pricelistProductVM.Order.OrderDetails.Add(autoFillOd);
Когда я db.SaveChanges(), я получаю сообщение об ошибке.
Вы заметите, что ошибка на ребенка из OrderDetails: OrderDetail_OrderDetailPricelistProductOptions_Source
Почему я не могу добавить OrderDetail динамически в коллекции OrderDetails? Все OrderDetails являются новыми (для вставки), поэтому значения между копиями одинаковы, за исключением свойства Quantity, которое не должно быть проблемой.
Действие контроллера заключается в следующем:
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Add(pricelistProductVM pricelistProductVM)
{
OrderLogic ol = new OrderLogic();
//Auth is running on execute
int userId = WebSecurity.CurrentUserId;
int websiteId = (int)Session["websiteId"];
int? id = null; // mediaId
int productId = pricelistProductVM.Product.ProductId;
int? eventId = pricelistProductVM.eventId;
string err = "";
if (productId > 0)
{
//Set Pricelist
Pricelist pricelist = ol.setPricelist(websiteId, id, eventId);
if (pricelist.PricelistId != 0)
{
//get the pricelistproduct from the pricelist
PricelistProduct pp = await (from ppx in db.PricelistProducts
where ppx.ProductId == productId
&& ppx.PricelistId == pricelist.PricelistId
&& ppx.isAvailable == true
&& ppx.DiscontinuedDate == null
&& ppx.Product.isAvailable == true
&& ppx.Product.DiscontinuedDate == null
select ppx).SingleOrDefaultAsync();
if (pp != null)
{
Order order = new Order();
//set some default values for the Order entity
if (pricelistProductVM.Order.OrderId == 0)
{
pricelistProductVM.Order.WebsiteId = websiteId;
pricelistProductVM.Order.UserId = userId;
pricelistProductVM.Order.EventId = eventId;
pricelistProductVM.Order.StartedDate = DateTime.UtcNow;
order = pricelistProductVM.Order;
}
else
{
order = await db.Orders.FindAsync(pricelistProductVM.Order.OrderId);
}
//set some default values for the OrderDetails entity
pricelistProductVM.Order.OrderDetails.First().InjectFrom(pp);
pricelistProductVM.Order.OrderDetails.First().IsPackage = false;
//determine if this product should be automatically added to any packages in the order
OrderDetail autoFillOd = ol.packageCheck(ref pp, ref pricelistProductVM, ref order, websiteId, db);
if (autoFillOd != null)
{
if (autoFillOd.Quantity > 0)
{
//This is where the OrderDetail that causes a problem is added
pricelistProductVM.Order.OrderDetails.Add(autoFillOd);
}
}
if (pricelistProductVM.Order.OrderId == 0)
{
db.Orders.Add(order);
}
else
{
order.OrderDetails.AddRange(pricelistProductVM.Order.OrderDetails);
db.Entry(order).State = EntityState.Modified;
}
db.SaveChanges();
}
else
{
//return error
err = "The product was not found in the available pricelist. Please reload your browser and make sure you are signed-in.";
}
}
}
else
{
//return error
err = "A productId was not passed so no product could not be found. Please reload your browser and make sure you are signed-in.";
}
if (err == "")
{
ViewBag.data = JsonConvert.SerializeObject(new { Success = 1, Msg = "The product was successfully added to your cart." });
}
else
{
ViewBag.data = JsonConvert.SerializeObject(new { Success = 0, Msg = err });
}
return View();
}
Я ценю помощь!
у вас есть fluentapi конфигурации для этой модели? – Mario