.net LINQ—当实体作为属性传递给另一个类时,如何使更改跟踪工作正常

.net LINQ—当实体作为属性传递给另一个类时,如何使更改跟踪工作正常,.net,linq,datacontext,.net,Linq,Datacontext,以下是场景: 我有一个ASP.NET用户控件,它运行LINQ查询,将结果存储在通用列表中,然后动态加载另一个用户控件(到占位符中),并通过控件上的属性将列表中的一个对象传递给控件 子控件显示来自对象的数据,并允许用户更改各种字段。父控件上的Save按钮调用子控件上的“SaveInput”方法,该方法根据输入的数据更新对象的属性(此时尚未创建DataContext) 问题是我似乎无法使用DataContext的SubmitChanges方法来保存更新的对象。以下是我尝试过的: 如果我从父控件调用

以下是场景:

我有一个ASP.NET用户控件,它运行LINQ查询,将结果存储在通用列表中,然后动态加载另一个用户控件(到占位符中),并通过控件上的属性将列表中的一个对象传递给控件

子控件显示来自对象的数据,并允许用户更改各种字段。父控件上的Save按钮调用子控件上的“SaveInput”方法,该方法根据输入的数据更新对象的属性(此时尚未创建DataContext)

问题是我似乎无法使用DataContext的SubmitChanges方法来保存更新的对象。以下是我尝试过的:

  • 如果我从父控件调用SubmitChanges,它不会识别有要保存的更改,即使在检查原始对象(在父控件的列表中)时,它显然有新的属性值。我猜这是因为更改不是通过父控件的DataContext进行的

  • 如果我尝试(在父控件的代码中)将对象附加到DataContext,我会得到一个错误,即它已经被附加了(是的,这很公平)

  • 如果我创建了一个DataContext(在子控件的代码中),然后尝试将对象附加到它,我会得到一个错误,即它已经附加到另一个DataContext(同样,这是真的)

因此,我笨拙的解决方案是创建一个DataContext(在子控件的代码中),然后创建一个对象类型的新实例,然后从修改后的对象上的等效对象设置这个新对象上的每个属性,然后提交更改。不是很优雅,但很管用


有更好的方法吗?

我建议从新的DataContext中重新提取准确的记录,例如

ctxt.Table.Where(x => x.ID == recordYouHave.ID).FirstOrDefault()
然后在调用“SubmitChanges”之前保存对该记录的更改

另一种解决方案是保留用于获取原始记录的上下文,但是您不想这样做每个上下文都应该是短暂的

编辑:不过,我应该提到的一点值得注意的是,您可以将一个实体附加到一个新的上下文,但是您必须再次提取原始记录,这样它就不会保存另一个数据库调用。您不必指定对象的属性:

var orig = ctxt.Table.Where(x => x.ID == recordYouHave.ID).FirstOrDefault();
ctxt.Table.Attatch(orig, recordYouHave);

我建议从新的DataContext中重新提取确切的记录,比如

ctxt.Table.Where(x => x.ID == recordYouHave.ID).FirstOrDefault()
然后在调用“SubmitChanges”之前保存对该记录的更改

另一种解决方案是保留用于获取原始记录的上下文,但是您不想这样做每个上下文都应该是短暂的

编辑:不过,我应该提到的一点值得注意的是,您可以将一个实体附加到一个新的上下文,但是您必须再次提取原始记录,这样它就不会保存另一个数据库调用。您不必指定对象的属性:

var orig = ctxt.Table.Where(x => x.ID == recordYouHave.ID).FirstOrDefault();
ctxt.Table.Attatch(orig, recordYouHave);

你所描述的(正在提取确切的记录…)听起来像是我已经在做的(我的“笨重”解决方案)。我也读了那篇关于拥有一个短期数据上下文的文章,所以我不会尝试!我提到的方法确实与您的方法非常相似,但它的好处是它不是对象类型的新实例,而是您想要更改的实际对象。除此之外,没有什么不同。不过,我担心,一旦一个对象失去了其原始上下文,就无法将其附加到另一个对象。但愿我能有更好的帮助!添加了对Attach方法的解释,但我仍然不认为它解决了您的问题,因为您仍然需要从新上下文中获取原始记录。您所描述的内容(重新提取精确记录…)听起来像我已经在做的事情(我的“笨重”解决方案)。我还阅读了关于拥有短期数据上下文的文章,所以我不会再尝试了!我提到的方法确实与您的方法非常相似,但它的好处是它不是对象类型的新实例,而是您想要更改的实际对象。除此之外,没有什么不同。不过,我担心,一旦一个对象失去了其原始上下文,就无法将其附加到另一个对象。但愿我能有更好的帮助!添加了对Attach方法的解释,但我仍然不认为它解决了您的问题,因为您仍然需要从新上下文中获取原始记录。删除了linq to sql标记。它与LINQRemoved linq to sql标记不同。这和林克不一样