我有一个Person表,其中有一个可以为空的AddressId,它是一个外键输入到Address表。所以零......一对多。
使用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(firstname ='Harry'),这很棒但是它也会生成一个sql INSERT语句,试图添加新地址(等等,等等)。 (我知道,因为我检查了sql profiler中生成的SQL)它出错了,因为我有像StateId这样的字段不可为空,但我不想让它甚至尝试添加该地址(我试图阻止它是通过制作它请帮帮我。
注意:我之前已成功使用集合(多对多关系)我可以做person.Addresses.Add(addressObj)然后person.Addresses.Remove(addressObj)和ObjectContext知道不进行插入.. ..只是不确定如何处理这个0..1到多个地址的情况。
感谢。
答案 0 :(得分: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();