ASP.net实体框架无法确定关系的主要结束

时间:2015-03-11 21:54:11

标签: c# asp.net sql-server entity-framework

我希望有人可以在这里指出我正确的方向。我正在使用Entity Framework构建一个c#ASP.net应用程序。我用数据库第一种方法。 为了简单起见,假设我有3个相关的表。报告,a_report_vehicle和Vehicle。我在每个表中都有主键。 a_report_vehicle具有Report表和Vehicle表的外键。 所以,我试图将许多车辆与一份报告联系起来。我意识到我可以通过在Vehicle表中添加Report表键来简化设计并消除链接表。但是,Vehicle表也与其他表有关。所以,我想保留a_report_vehicle链接表。

enter image description here

以下是此问题最相关的代码。请注意,我在此代码上方有一个与Report表相关的对象。 (newReport)我也有newVehicle1和newVehicle2的对象。

另请注意,如果我添加一个车辆,并在a_report_vehicle表中添加了一行,则此逻辑可正常工作。当我尝试在链接表中添加2行(2个单独的Vehicle对象)和2行时,我收到错误'无法确定关系的主要结束'。

我查看过其他帖子并尝试将虚拟值添加到vehicleID,但这不起作用。实际上,如果我将第一个vehicleID设置为1而第二个设置为2,因为这些值实际存在于我的Vehicle表中,Entity Framework使用这些虚拟值,就好像它们是真正的键值一样。其他帖子让我相信Entity Framework只是希望我在键中添加占位符值,它会解析数据库插入的真正键。

以下是相关的代码段。任何提示都将不胜感激。

 using (I.IE ctx = new I.IE()){
            int rID, vID1, vID2;

            ctx.t_Report.AddObject(newReport);
            rID = newReport.ID;


    ctx.t_Vehicle.AddObject(newVehicle1);
                    vID1 = newVehicle1.ID;


                    ctx.a_Report_Vehicle.AddObject(new a_Report_Vehicle
                    {
                        reportID = rID,
                        association_type = "text",
                        remarks = "Test",
                        DC = DateTime.Now,
                        UC = "3845",
                        vehicleID = vID1

                    });


                    ctx.t_Vehicle.AddObject(newVehicle2);
                    vID2 = newVehicle2.ID;

                    ctx.a_Report_Vehicle.AddObject(new a_Report_Vehicle
                    {
                        reportID = rID,
                        association_type = "text",
                        remarks = "Test",
                        DC = DateTime.Now,
                        UC = "3845",
                        vehicleID = vID2

                    });}

在格特的帮助下,我设法增加了2辆车。以下是似乎有效的修改后的代码。 (将新的a_Report_Vehicle对象添加到相应的t_Vehicle导航属性Entity Collection和Entity Framework将管理密钥)

ctx.t_Vehicle.AddObject(newVehicle1);
                    vID1 = newVehicle1.ID;

                    newVehicle1.a_Report_Vehicle.Add(new a_Report_Vehicle
                    {
                        reportID = rID,
                        association_type = "text",
                        remarks = "Test",
                        DC = DateTime.Now,
                        UC = "3845",
                        vehicleID = vID1
                    });


                    ctx.t_Vehicle.AddObject(newVehicle2);
                    vID2 = newVehicle2.ID;

                    newVehicle2.a_Report_Vehicle.Add(new a_Report_Vehicle
                    {
                        reportID = rID,
                        association_type = "text",
                        remarks = "Test",
                        DC = DateTime.Now,
                        UC = "3845",
                        vehicleID = vID2
                    });

enter image description here

2 个答案:

答案 0 :(得分:1)

问题是您要将新Vehicles的键值分配给外键。但在那一刻,这些值仍为0。

您应该将Vehicle 对象分配给t_Vehicle导航属性。然后EF将按所需顺序插入所有对象,以便能够获取生成的PK值并将其用于新的Report_Vehicle记录。

这同样适用于新的Report对象。

答案 1 :(得分:0)

我将对此进行一次尝试,并说我相信问题在于,在通过调用SaveChanges()实际插入数据库之前,您尝试使用插入对象的ID。 / p>

尝试添加:

ctx.SaveChanges();
每次调用AddObject();之后,在尝试获取插入对象的id之前

在您致电SaveChanges()之前,实际上没有任何内容保存到数据库中,并且您的自动增量ID尚未实际生成并返回给实体。