1

我有一个 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 到多个地址的情况。

谢谢。

4

1 回答 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();
于 2012-09-13T08:56:48.107 回答