Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架6的多重性为1或0..1_C#_Entity Framework_Entity Framework 6 - Fatal编程技术网

C# 实体框架6的多重性为1或0..1

C# 实体框架6的多重性为1或0..1,c#,entity-framework,entity-framework-6,C#,Entity Framework,Entity Framework 6,在模型绑定器创建了模型、子对象和子对象,然后使用context.SaveChanges()将对象插入子集合时,我收到以下错误: 违反了多重性约束。关系“PPLib.Models.OrderDetail\u OrderDetailPricelistProductOptions”的角色“OrderDetail\u OrderDetailPricelistProductOptions\u Source”的多重数为1或0..1 我的模型如下(为了简洁起见删除了属性) 如果我提交一个编辑和现有订单,以及一

在模型绑定器创建了模型、子对象和子对象,然后使用context.SaveChanges()将对象插入子集合时,我收到以下错误:

违反了多重性约束。关系“PPLib.Models.OrderDetail\u OrderDetailPricelistProductOptions”的角色“OrderDetail\u OrderDetailPricelistProductOptions\u Source”的多重数为1或0..1

我的模型如下(为了简洁起见删除了属性)

如果我提交一个编辑和现有订单,以及一个新的订单详细信息列表、其OrderDetailPricelistProductOptions列表和其OrderDetailPricelistProductOptions列表,我将从DB上下文中获取订单,然后使用以下方法从视图模型中合并OrderDetails:

order.OrderDetails.AddRange(pricelistProductVM.Order.OrderDetails);
我在执行以下操作时没有收到任何错误:

db.Orders.Add(order);
db.SaveChanges();
db.Entry(order).State = EntityState.Modified;
db.SaveChanges();
我有一个特殊的情况,我必须实例化一个名为autoFillOd的新OrderDetail,并从模型绑定器组装的现有OrderDetails中注入它的值。我更改其Quantity值,然后将其添加到ViewModel中的OrderDetails集合中,如下所示:

pricelistProductVM.Order.OrderDetails.Add(autoFillOd);
当我执行db.SaveChanges()时,我收到错误

您会注意到错误出现在OrderDetails:OrderDetail\u OrderDetailPricelistProductOptions\u源的子级上

为什么我不能将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();
    }
[HttpPost]
[ValidateAntiForgeryToken]
公共异步任务添加(pricelistProductVM pricelistProductVM)
{
OrderLogic ol=新的OrderLogic();
//Auth正在执行上运行
int userId=WebSecurity.CurrentUserId;
int websiteId=(int)会话[“websiteId”];
int?id=null;//mediaId
int productId=pricelistProductVM.Product.productId;
int?eventId=pricelistProductVM.eventId;
字符串err=“”;
如果(productId>0)
{
//定价单
Pricelist Pricelist=ol.setPricelist(websiteId、id、eventId);
如果(pricelist.PricelistId!=0)
{
//从pricelist中获取pricelistproduct
PricelistProduct pp=Wait(来自db.PricelistProducts中的ppx
其中ppx.ProductId==ProductId
&&ppx.PricelistId==pricelist.PricelistId
&&ppx.isAvailable==true
&&ppx.ddate==null
&&ppx.Product.isAvailable==true
&&ppx.Product.ddate==null
选择ppx.SingleOrDefaultAsync();
如果(pp!=null)
{
订单=新订单();
//为订单实体设置一些默认值
如果(pricelistProductVM.Order.OrderId==0)
{
pricelistProductVM.Order.WebsiteId=WebsiteId;
pricelistProductVM.Order.UserId=UserId;
pricelistProductVM.Order.EventId=EventId;
pricelistProductVM.Order.StartedDate=DateTime.UtcNow;
订单=pricelistProductVM.order;
}
其他的
{
order=wait db.Orders.FindAsync(pricelistProductVM.order.OrderId);
}
//为OrderDetails实体设置一些默认值
pricelistProductVM.Order.OrderDetails.First().InjectFrom(pp);
pricelistProductVM.Order.OrderDetails.First().IsPackage=false;
//确定是否应将此产品自动添加到订单中的任何包中
OrderDetail autoFillOd=ol.packageCheck(参考pp、参考pricelistProductVM、参考订单、网站ID、db);
如果(自动填充!=null)
{
如果(自动填充数量>0)
{
//这是添加导致问题的OrderDetail的地方
pricelistProductVM.Order.OrderDetails.Add(自动填充);
}
}
如果(pricelistProductVM.Order.OrderId==0)
{
db.Orders.Add(订单);
}
其他的
{
order.OrderDetails.AddRange(pricelistProductVM.order.OrderDetails);
db.Entry(order).State=EntityState.Modified;
}
db.SaveChanges();
}
其他的
{
//返回错误
err=“在可用价格表中找不到该产品。请重新加载浏览器并确保您已登录。”;
}
}
}
其他的
{
//返回错误
err=“未传递productId,因此找不到任何产品。请重新加载浏览器并确保您已登录。”;
}
如果(错误==“”)
{
ViewBag.data=JsonConvert.SerializeObject(新的{Success=1,Msg=“产品已成功添加到购物车。”});
}
其他的
{
ViewBag.data=JsonConvert.SerializeObject(新的{Success=0,Msg=err});
}
返回视图();
}

我感谢你的帮助

我认为OrderDetailPricelistProductOption.OrderDetailId不能是单一的->它应该是一个列表,因为它可以
[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();
    }