在Linq2SQL中更新实体的最佳做法是什么?

时间:2012-04-13 09:34:19

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

只是想了解使用linq2sql更新实体的最佳做法是什么?

更多细节可以更好地解决问题。

正如我从文章中所理解的,我可以有两种情况:实体附加到上下文和从头开始构建的实体(或来自现有实体)。我想只有一种方法来更新entites,现在以下列方式实现:

 public virtual void Save<T>(T value) where T : class
 {
      Context.GetTable<T>().Attach(value);
      Context.Refresh(RefreshMode.KeepCurrentValues, value);
      Context.SubmitChanges();
 }

当然,当我执行代码时:

var orders = GenericRepository.Instance.Find<BuyerOrder>(b => b.ID == 2).FirstOrDefault();
orders.Price = 397809;
GenericRepository.Instance.Save(orders); 

该对象已经附加到上下文中,我得到了一个例外:

Cannot attach an entity that already exists.

我应该在保存之前始终分离物体吗?还有另一种方法可以解决这个问题吗?

对不起,如果问题是愚蠢的 - 这是我第一次使用linq2sql

2 个答案:

答案 0 :(得分:1)

Save方法中,请勿附加表格。它也不需要输入类型,您可以在Save方法中调用Context.SubmitChanges。类似的东西:

public void Save()
{
    Context.SubmitChanges();
}

然后做:

var orders = GenericRepository.Instance.Find<BuyerOrder>(b => b.ID == 2).FirstOrDefault();
orders.Price = 397809;
GenericRepository.Instance.Save(); 

有关更多示例,请参阅MSDN:http://msdn.microsoft.com/en-us/library/bb386931.aspx

答案 1 :(得分:1)

您可以检查实体是否附加如下:

if (!Context.GetTable<T>().IsAttached(value))
{
    Context.GetTable<T>().Attach(value);
}
Context.Refresh(RefreshMode.KeepCurrentValues, value);
Context.SubmitChanges();