在L2S中附加vs选择和修改

时间:2013-05-09 11:39:30

标签: c# asp.net linq-to-sql

我有一个数据访问层,它创建一个上下文并检索数据(没有对象跟踪)并将信息传递回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来轻松地检索和更新数据库。

我从未见过有人在LINQ语境中讨论这两种方法,这就是我要求最佳实践的原因。

2 个答案:

答案 0 :(得分:1)

如果您因为性能而不想使用(2):另一个选项是附加新对象以提交更新。

Foo foo=new Foo { FooId=fooId }; // create obj and set keys
context.Foos.Attach(foo);
foo.Name="test";
context.SubmitChanges();

See my answer here

答案 1 :(得分:0)

根据@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语句的数量。