创建新对象(Foo)后,我为EntityRef关联属性(Bar)设置了键(BarId)。然后我想将新对象插入数据库,然后能够访问延迟加载的子对象。
不幸的是,在调用InsertOnSubmit()之后,lazy-loading属性返回null。但是,如果我将对象Attach()添加到数据上下文中,它将返回正确的对象。
这是成功将新对象插入数据库的代码,但未正确设置子Bar属性的延迟加载:
var foo = new Foo();
foo.BarId = 123;
context.GetTable<Foo> ().InsertOnSubmit( foo );
foo.Bar.Something(); // throws NullReferenceException
这里,Bar对象已正确加载:
var foo = new Foo();
foo.BarId = 123;
context.GetTable<Foo> ().Attach( foo );
foo.Bar.Something(); // method is called on lazy-loaded Bar object
在InsertOnSubmit之前调用Attach会导致后者抛出“无法添加已存在的实体”异常。
那么,这是否是LINQ-to-SQL中的错误,其中插入的对象未正确附加到数据上下文?
我该如何解决这个问题?
答案 0 :(得分:3)
我会设置Bar属性而不是Foo类的BarId属性。在我看来,Linq-to-sql在这里做错了就是首先拥有BarId属性。它没有添加任何值,它违背了OOP的核心原则。所以,我会将你的代码更改为:
var foo = new Foo();
foo.Bar = //get bar with id: 123;
context.GetTable<Foo> ().InsertOnSubmit(foo);
foo.Bar.Something();