InsertOnSubmit没有附加?

时间:2010-03-03 14:09:55

标签: c# linq-to-sql

创建新对象(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中的错误,其中插入的对象未正确附加到数据上下文?

我该如何解决这个问题?

1 个答案:

答案 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();