0

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

更多细节可以更好地理解这个问题。

正如我从文章中了解到的那样,我可以有两种情况:实体附加到上下文和从头开始(或从现有实体)构造的实体。我只想有一种方法来更新实体,目前以以下方式实现:

 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 的第一次体验

4

2 回答 2

1

您可以像这样检查实体是否附加:

if (!Context.GetTable<T>().IsAttached(value))
{
    Context.GetTable<T>().Attach(value);
}
Context.Refresh(RefreshMode.KeepCurrentValues, value);
Context.SubmitChanges();
于 2012-04-13T13:08:08.447 回答
1

在您的Save方法中,不要附加表格。它也不需要采用类型,您只需Context.SubmitChanges在 Save 方法中调用即可。就像是:

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

于 2012-04-13T10:00:50.383 回答