C# L2S中的附加vs选择和修改
我有一个数据访问层,它创建上下文并检索数据(无对象跟踪),并将信息传递回UI层:- 我的工作单元是一个方法,我在执行特定的方法后释放appdatacontext。因此,我不会在任何地方跟踪数据上下文C# L2S中的附加vs选择和修改,c#,asp.net,linq-to-sql,C#,Asp.net,Linq To Sql,我有一个数据访问层,它创建上下文并检索数据(无对象跟踪),并将信息传递回UI层:- 我的工作单元是一个方法,我在执行特定的方法后释放appdatacontext。因此,我不会在任何地方跟踪数据上下文 public LinqObject GetObject(){ using (appdatacontext = new DataContext()){ ---code to select and return object } } 我将使用UI中的表单修改数据,并将数据提交回DB 两
public LinqObject GetObject(){
using (appdatacontext = new DataContext()){
---code to select and return object
}
}
我将使用UI中的表单修改数据,并将数据提交回DB
两种方法是:-
1. Detach and reattach to a different data context using [Detach..Serialise and Attach]
*I have to do a lot of plumping code to enable this functionality*
2. Get the DB object using primary key and make changes in the selected object and SubmitChanges.
哪一种方法更适合完成此任务
我完全反对将工作单元转移到数据访问层或Web应用程序生命周期(httpcontext),因为我不想跟踪更改,也不想用不需要的大量代码使整个应用程序结构复杂化。我只是使用LINQ来简化对DB的检索和更新
我从未见过有人在LINQ环境中讨论这两种方法,这就是我要求最佳实践的原因。如果您因为性能原因不想使用(2):另一种选择是附加一个新对象以提交更新
Foo foo=new Foo { FooId=fooId }; // create obj and set keys
context.Foos.Attach(foo);
foo.Name="test";
context.SubmitChanges();
.根据@Chris的评论。我最终得出了如下解决方案:-
function void SaveRow(Table.RowObject object) {
var original=null;
using (context= new DataContext())
{
context.ObjectTrackingEnabled = false;
original = {query}.Single();
}
using(context=new DataContext()){
try
{
context.Table.Attach(object, original);
context.SubmitChanges();
}
catch (Exception exception) {
saveStatus = false;
}
}
}
我保留更新检查以确保存在并发检查,如果禁用该功能,我可以减少Linq生成的where语句的数量。我建议您检查。这是您的首选解决方案。我必须在EF3.5中使用这个。我不知道在4.0及更高版本中是否解决了这个问题。我尝试了这个方法,并且正在工作,正如您所知,在提交更改之前,我必须手动继续并分配每个值。如何一次性复制实体值并提交更改?我尝试克隆(DatacontractSerializer)我传递的对象并分配它,但它不起作用。有什么解决办法吗?你可以通过思考来解决。