实体框架:对多对多关系的参照完整性约束违规

Not*_*ple 34 c# entity-framework

嘿,我有一个带有一堆inproc缓存和实体框架的应用程序.当我想写一个实体的更新时,我重新附加了缓存的副本.我跟踪我在上下文生命周期中附加的所有内容,所以我不会尝试将它们附加两次.

我在附加时发生错误(在大多数情况下很少这样做很好并且非常快),其中说明如下:

发生了引用完整性约束违规:定义引用约束的属性值在关系中的主体和从属对象之间不一致.

我仔细看了一下看似正常的实体.我认为这个问题是由于修复程序运行时附加/分离外键.

是否有一个很好的方法来获取有关此错误的更多信息,或者是否因为实体处于EF未期望的状态而发生?

编辑:DB Diagram(注意我正在使用codefirst我刚刚使用EDMX工具制作图表,为了简单起见,我还从模型中删除了一堆常规属性)

在此输入图像描述

Sla*_*uma 48

可能发生的错误之间的一个一对多的关系PersonLocation你显然有另外的许多一对多的关系模型.例如,以下代码将抛出异常:

using (var context = new MyContext())
{
    var person = new Person
    {
        CurrentLocationId = 1,
        CurrentLocation = new Location { Id = 2 }
    };
    context.People.Attach(person); // Exception
}
Run Code Online (Sandbox Code Playgroud)

"定义参照约束的属性值"是外键属性值CurrentLocationId和主键值CurrentLocation.Id.如果这些值不同,则抛出异常.(有CurrentLocation因为null虽然是允许的.)

在我看来,只能为外键关联抛出此异常,因为只有这种类型的关联,您才具有在模型中定义参照约束的属性.它不能被独立的协会抛出.由于每个多对多关系都是一个独立的关联(模型中没有外键属性),我的猜测是错误与你的多对多关系无关,而是与一对多有关.


小智 7

我遇到了一个非常相似的例外:

"A referential integrity constraint violation occurred: 
The property value(s) of 'ObjectA.PropertyX' on one end of a relationship 
do not match the property value(s) of 'ObjectB.PropertyY' on the other end."
Run Code Online (Sandbox Code Playgroud)

其原因是这样的:在网络API的客户侧发送的PUT请求与包括导航属性整个对象(在此实例对象A(更正确ObjectB.ObjectA)中的导航属性和由所述客户端被充分提供).发生这种情况是因为客户端从服务器接收整个对象并将其原样弹回到服务器并进行微小更改.

另一方面,ObjectB.PropertyY刚刚被更改(这首先是PUT请求的原因).

由于ObjectB.PropertyY是对同一对象ObjectA(外键)的引用,因此EF尝试协调此操作并因上述异常而失败.

解决方案很简单:

ObjectB.ObjectA = null;
Run Code Online (Sandbox Code Playgroud)

在SaveChanges()完全解决了这个问题之前.

我希望这可以帮助别人.