Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# L2S中的附加vs选择和修改_C#_Asp.net_Linq To Sql - Fatal编程技术网

C# L2S中的附加vs选择和修改

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 两

我有一个数据访问层,它创建上下文并检索数据(无对象跟踪),并将信息传递回UI层:-

我的工作单元是一个方法,我在执行特定的方法后释放appdatacontext。因此,我不会在任何地方跟踪数据上下文

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)我传递的对象并分配它,但它不起作用。有什么解决办法吗?你可以通过思考来解决。