Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 实体框架ObjectContext在保存更改之前删除实体_.net_Entity Framework_Objectcontext - Fatal编程技术网

.net 实体框架ObjectContext在保存更改之前删除实体

.net 实体框架ObjectContext在保存更改之前删除实体,.net,entity-framework,objectcontext,.net,Entity Framework,Objectcontext,我有一个Person表,其中有一个可空的AddressId,它是地址表的外键。所以零…一对多 使用EF和ObjectContext,我可以调用person.Address来访问person的Address对象。干净利落 看看这段相当简单的代码,然后我将告诉您我的问题: var _db = new DataContext(); Person person = _db.getThatOneGuy(); //some changes are done to the person object per

我有一个Person表,其中有一个可空的AddressId,它是地址表的外键。所以零…一对多

使用EF和ObjectContext,我可以调用person.Address来访问person的Address对象。干净利落

看看这段相当简单的代码,然后我将告诉您我的问题:

var _db = new DataContext();
Person person = _db.getThatOneGuy();

//some changes are done to the person object
person.FirstName = "Harry";

//If there's no address I want to make one
if(person.Address == null)
person.Address = new Address();

person.Address.StreetOne = "blah";
person.Address.StreetTwo = "blah";

//I decide I don't actually want this new address
person.Address = null;

_db.SaveChanges();
调用SaveChanges仍然会生成一个sqlupdatefirstname='Harry',这很好,但它也会生成一个sqlinsert语句,试图添加新地址等等。我知道,因为我在SQL profiler中检查了生成的SQL It错误,因为我有StateId之类的字段不可为null,但我甚至不希望它尝试添加该地址,我试图阻止它是通过使其为null。请帮助我

注意:我以前成功地处理了集合多对多关系,在这些关系中,我可以执行person.Addresses.AddaddressObj,然后执行person.Addresses.RemoveaddressObj,ObjectContext知道不执行插入操作。。。。只是不知道如何处理这种0..1对多地址的情况


谢谢。

问题在于,将Address属性设置为null不会从上下文中删除Address实例。它只通知上下文Person实例和Address实例之间没有关系。您仍然必须从上下文中删除地址实例。试试这个:

_db.Detach(person.Address);
_db.SaveChanges();
或:


谢谢你,这确实有效。我还必须在调用_db.Detachaddress后设置:person.AddressId=null。这是因为调用person.Address=新地址将person.AddressId设置为0之前为空。我需要它为null,因为数据库中没有Id=0的地址,所以引发了外键错误。再次感谢。
var address = person.Address; 
person.Address = null;
_db.Detach(address);
_db.SaveChanges();