C# 引用完整性错误实体框架6

C# 引用完整性错误实体框架6,c#,entity-framework-6,C#,Entity Framework 6,我有以下课程(为简洁起见减少) 在这种情况下,与之关联的设备将存在。然而,我得到了错误 发生引用完整性约束冲突:属性 关系一端的“Device.ID”值与 另一端的“Installation.DeviceID”的属性值 现在,从调试时的深入分析来看,问题是当安装对象获取对象时,安装对象内部的外键没有被设置?(请参见下面的屏幕)。但实际安装设备正在设置中?请问我该怎么处理这件事 这是因为您颠倒了外键参考代码的正确顺序。在这里: [ForeignKey("Device")] [JsonPropert

我有以下课程(为简洁起见减少)

在这种情况下,与之关联的设备将存在。然而,我得到了错误

发生引用完整性约束冲突:属性 关系一端的“Device.ID”值与 另一端的“Installation.DeviceID”的属性值

现在,从调试时的深入分析来看,问题是当安装对象获取对象时,安装对象内部的外键没有被设置?(请参见下面的屏幕)。但实际安装设备正在设置中?请问我该怎么处理这件事


这是因为您颠倒了外键参考代码的正确顺序。在这里:

[ForeignKey("Device")]
[JsonProperty(PropertyName = "deviceid")]
public int? DeviceID { get; set; }
public virtual Device Device { get; set; }
应该是

[JsonProperty(PropertyName = "deviceid")]
public int? DeviceID { get; set; }
[ForeignKey("DeviceID")]
public virtual Device Device { get; set; }

这是因为您颠倒了外键参考代码的正确顺序。在这里:

[ForeignKey("Device")]
[JsonProperty(PropertyName = "deviceid")]
public int? DeviceID { get; set; }
public virtual Device Device { get; set; }
应该是

[JsonProperty(PropertyName = "deviceid")]
public int? DeviceID { get; set; }
[ForeignKey("DeviceID")]
public virtual Device Device { get; set; }

您在安装中将外键设备id设置为可设置为
null
int是否有原因?是的,最初创建安装时,设备为null,稍后分配。或者,我会尝试显式设置id,如果实体已经存在,但空值阻止自动更新,那么可能会有一些细微差别。您在安装中将外键设备ID设置为
null
int有什么原因吗?是的,最初创建安装时,设备为空值,稍后分配。或者,我会尝试显式设置对于id,如果实体已经存在,但有空值阻止自动更新,那么可能会有一些细微差别。谢谢。我总是用另一种方式标记外键?请问这有什么区别?因为这没什么区别?我仍然得到相同的错误。这里,DeviceID是实际的外键,您将外键表名指定为外键。但是,您是正确的,因为您遵循的命名约定(即设备和DeviceID)可能仍然有效,因此它仍然知道实际外键是什么。请参阅我的其他评论,了解更多可能的修复方法!感谢下面的回答和补充意见。理想情况下,我想尝试并找到一个通用的解决方案,因为它建立在一个通用的回购协议?为什么如果ex知道实体是相关的,那么fk不被填充?我能做些什么来“告诉”ef这样做吗?是的,你应该能够在更新该条目时显式地设置id外键!对不起,乔纳森,我明白你的意思,我只是想知道为什么ef在这样做时不自动填充它。我对这种情况的理解是,如果设置了FK ID(例如DeviceID),则会将实体标记为存在。如果我将I DeviceID标记为NULL或0,那么基础类型(设备)是否标记为插入?所以在本例中,我已经完成了所有相关项的获取,但它只是填充了字符串类型,而不是ID?(如果有道理,请告诉我:)谢谢你。我总是用另一种方式标记外键?请问这有什么区别?因为这没什么区别?我仍然得到相同的错误。这里,DeviceID是实际的外键,您将外键表名指定为外键。但是,您是正确的,因为您遵循的命名约定(即设备和DeviceID)可能仍然有效,因此它仍然知道实际外键是什么。请参阅我的其他评论,了解更多可能的修复方法!感谢下面的回答和补充意见。理想情况下,我想尝试并找到一个通用的解决方案,因为它建立在一个通用的回购协议?为什么如果ex知道实体是相关的,那么fk不被填充?我能做些什么来“告诉”ef这样做吗?是的,你应该能够在更新该条目时显式地设置id外键!对不起,乔纳森,我明白你的意思,我只是想知道为什么ef在这样做时不自动填充它。我对这种情况的理解是,如果设置了FK ID(例如DeviceID),则会将实体标记为存在。如果我将I DeviceID标记为NULL或0,那么基础类型(设备)是否标记为插入?所以在本例中,我已经完成了所有相关项的获取,但它只是填充了字符串类型,而不是ID?(如果有道理,请告诉我:))
[JsonProperty(PropertyName = "deviceid")]
public int? DeviceID { get; set; }
[ForeignKey("DeviceID")]
public virtual Device Device { get; set; }