首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >实体框架保存时的InvalidOperationException

实体框架保存时的InvalidOperationException
EN

Stack Overflow用户
提问于 2016-09-07 01:36:17
回答 1查看 430关注 0票数 1

当我创建一个新的EF对象时,我首先将它附加到DbSet,然后将它的一个导航属性设置为另一个EF对象的新实例。然后我将第一个EF添加到DbSet中,并调用save。我得到了以下异常:

代码语言:javascript
运行
复制
System.InvalidOperationException: The changes to the database were committed 
successfully, but an error occurred while updating the object context. The 
ObjectContext might be in an inconsistent state. Inner exception message: A 
referential integrity constraint violation occurred: The property value(s) of 
'Location.Id' on one end of a relationship do not match the property value(s) 
of 'Pool.LocationId' on the other end.

下面是我的代码:

代码语言:javascript
运行
复制
ORMContext context = new ORMContext();

var l = context.Locations.Create();
context.Locations.Attach(l);
...set properties
context.Locations.Add(l);

var p = context.Pools.Create();
context.Pools.Attach(p);
p.Location = l;
...set properties
context.Pools.Add(p);

context.SaveChanges();

我认为发生的事情是Location对象是新的,它的Id默认是0。EF更新Pool上的外键(设置为0),然后在将Location对象保存到数据库后更新Location.Id。因此,Location.Id现在被设置为数据库中的关联值,比如149,而Pool.LocationId仍然被设置为0

如何避免此异常?或者我该怎么处理呢?

EN

Stack Overflow用户

发布于 2016-09-07 01:46:20

您可以在添加位置后保存,这样就可以设置对实体的引用

代码语言:javascript
运行
复制
    ORMContext context = new ORMContext();

    var l = context.Locations.Create();
    context.Locations.Attach(l);
    ...set properties
    context.Locations.Add(l);

    context.SaveChanges(); // save here, that way the location will get its Id
    var p = context.Pools.Create();
    context.Pools.Attach(p);
    p.Location = l;
    ...set properties
    context.Pools.Add(p);

    context.SaveChanges();

那将是一种方法

票数 2
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39354837

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档