繁体   English   中英

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

[英]ASP.net Entity Framework Unable to determine the principal end of relationship

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

在此处输入图片说明

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

还要注意,如果我在a_report_vehicle表中添加了一行加了一行的车辆,则此逻辑工作正常。 当我尝试在链接表中添加具有2行的2辆车辆(2个单独的Vehicle对象)时,收到错误消息“无法确定关系的主要终点”。

我查看了其他帖子,并尝试将伪值添加到VehicleID,但这没有用。 实际上,如果我将第一个VehicleID设置为1,将第二个VehicleID设置为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

                    });}

在Gert的协助下,我设法增加了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
                    });

在此处输入图片说明

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

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

新的Report对象也是如此。

我对此表示怀疑,我认为问题是您正在尝试通过调用SaveChanges()将插入的对象实际插入数据库之前使用它们的ID。

尝试添加:

ctx.SaveChanges();

在每次调用AddObject(); 在尝试获取插入对象的ID之前。

在调用SaveChanges()之前,实际上没有任何内容保存到数据库中,并且实际上还没有生成自动递增的ID并将其返回给实体。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM