2012-09-13 88 views
1

我有一个Person表,其中有一个可为空的AddressId,它是外键的Address表。所以零..一个到很多。实体框架ObjectContext在SaveChanges之前删除实体

使用EF和ObjectContext我可以调用person.Address来访问某个人的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()的调用仍然会产生一个SQL UPDATE(名字=“哈利”),这是伟大的,但它还会生成一条sql INSERT语句,试图添加新地址(blah,blah)。 (我知道,因为我检查了SQL分析器中生成的SQL)它的错误,因为我有像StateId这样的字段不可为空,但我不希望它甚至尝试添加该地址(我试图阻止它通过使它null)请帮助我。

注意:我之前已经成功使用过集合(多对多关系),在这里我可以执行person.Addresses.Add(addressObj)然后person.Addresses.Remove(addressObj)并且ObjectContext知道不要插入。 ...只是不知道如何处理这个0..1到很多地址的情况。

谢谢。

回答

0

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

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

或:

var address = person.Address; 
person.Address = null; 
_db.Detach(address); 
_db.SaveChanges(); 
+0

谢谢你这做的工作。我还必须在调用_db.Detach(address)之后设置:person.AddressId = null。这是因为调用person.Address = new Address()将person.AddressId设置为0(以前为空)。我需要它为空,因为在数据库中没有Id = 0的地址,因此引发了外键错误。再次感谢。 –