.net 实体框架ObjectContext在保存更改之前删除实体
我有一个Person表,其中有一个可空的AddressId,它是地址表的外键。所以零…一对多 使用EF和ObjectContext,我可以调用person.Address来访问person的Address对象。干净利落 看看这段相当简单的代码,然后我将告诉您我的问题:.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
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();