C# InsertOnSubmit不';你不接吗?

C# InsertOnSubmit不';你不接吗?,c#,linq-to-sql,C#,Linq To Sql,创建新对象(Foo)后,我为EntityRef关联属性(Bar)设置了键(BarId)。然后,我希望将新对象插入数据库,并能够在之后访问延迟加载的子对象 不幸的是,延迟加载属性在调用InsertOnSubmit()后返回null。但是,如果我将()对象附加到数据上下文,它将返回正确的对象 以下代码成功地将我的新对象插入数据库,但没有正确设置子栏属性的延迟加载: var foo=new foo(); foo.BarId=123; context.GetTable().InsertOnSubmit(

创建新对象(Foo)后,我为EntityRef关联属性(Bar)设置了键(BarId)。然后,我希望将新对象插入数据库,并能够在之后访问延迟加载的子对象

不幸的是,延迟加载属性在调用InsertOnSubmit()后返回null。但是,如果我将()对象附加到数据上下文,它将返回正确的对象

以下代码成功地将我的新对象插入数据库,但没有正确设置子栏属性的延迟加载:

var foo=new foo();
foo.BarId=123;
context.GetTable().InsertOnSubmit(foo);
foo.Bar.Something();//抛出NullReferenceException
此时,条形图对象已正确加载:

var foo=new foo();
foo.BarId=123;
context.GetTable().Attach(foo);
foo.Bar.Something();//方法在延迟加载的条对象上调用
在InsertOnSubmit之前调用Attach会导致后者引发“无法添加已存在的实体”异常

那么,在LINQtoSQL中,插入的对象没有正确地连接到数据上下文,这是一个bug吗


如何修复此问题?

我将设置Foo类的Bar属性而不是BarId属性。在我看来,LINQtoSQL在这里的错误之处在于首先拥有BarId属性。它没有增加任何价值,而且违背了OOP的核心原则。因此,我会将您的代码更改为如下内容:

var foo = new Foo();
foo.Bar = //get bar with id: 123;
context.GetTable<Foo> ().InsertOnSubmit(foo);
foo.Bar.Something();
var foo=new foo();
foo.Bar=//获取id为123的Bar;
context.GetTable().InsertOnSubmit(foo);
foo.Bar.Something();

使用InsertOnSubmit时,需要保存更改以将新对象提交到数据存储。这可能是个问题,因为创建一个新的数据项在对象被上下文填充之前(我想)不会与数据上下文内在地关联(从中延迟加载)。我明白了。不幸的是,我在数据上下文上构建了一个安全层,在调用SubmitChanges()之前检查对象/用户权限。该代码需要访问对象的某些属性,包括延迟加载的属性。这是否是一个好主意是值得怀疑的,但这是我现在必须解决的问题。@NickLarsen:我刚刚测试了这个,你是对的。延迟加载在调用SubmitChanges()后工作。这是有道理的。唯一的缺点是,现在我需要通过显式查询Bar,而不仅仅是设置一个ID,为我的代码增加少量额外的复杂性。是的,但在我看来这要好得多。从面向对象的角度来看,它看起来好多了。看看其他ORM,比如EF或nhibernate。
var foo = new Foo();
foo.BarId = 123;
context.GetTable<Foo> ().Attach( foo );
foo.Bar.Something();    // method is called on lazy-loaded Bar object
var foo = new Foo();
foo.Bar = //get bar with id: 123;
context.GetTable<Foo> ().InsertOnSubmit(foo);
foo.Bar.Something();