C# 在Linq2SQL中更新实体的最佳实践是什么?

C# 在Linq2SQL中更新实体的最佳实践是什么?,c#,asp.net-mvc,asp.net-mvc-3,linq,linq-to-sql,C#,Asp.net Mvc,Asp.net Mvc 3,Linq,Linq To Sql,只是想了解使用linq2sql更新实体的最佳实践是什么 再详细一点,以便更好地理解这个问题 正如我从文章中了解到的,我可以有两种情况:实体附加到上下文,实体从头构建(或从现有实体构建)。我只希望有一种方法来更新实体,目前采用以下方式实现: public virtual void Save<T>(T value) where T : class { Context.GetTable<T>().Attach(value); Context.Refr

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

再详细一点,以便更好地理解这个问题

正如我从文章中了解到的,我可以有两种情况:实体附加到上下文,实体从头构建(或从现有实体构建)。我只希望有一种方法来更新实体,目前采用以下方式实现:

 public virtual void Save<T>(T value) where T : class
 {
      Context.GetTable<T>().Attach(value);
      Context.Refresh(RefreshMode.KeepCurrentValues, value);
      Context.SubmitChanges();
 }
保存前是否应始终分离对象?有没有其他办法克服这个问题


很抱歉,如果这个问题是愚蠢的-这是我第一次使用linq2sql,在您的
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(); 
var orders=GenericRepository.Instance.Find(b=>b.ID==2.FirstOrDefault();
订单价格=397809;
GenericRepository.Instance.Save();

有关更多示例,请参见MSDN:

您可以检查实体是否按如下方式连接:

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

这是正确答案。永远不要分离你的实体,也不要耍花招。不要“保存”单个实体。对整个对象图进行更改,并在最后调用SaveChanges。谢谢您的回答。但是我如何定义实体是附加到上下文的呢?我想在1种方法中处理2种情况:当实体附加到上下文时,以及当实体未附加到上下文时,您可以使用此问题中概述的答案来定义是否附加了实体:对不起,可能我误解了smth。我看不到上下文的方法已设置。
var orders = GenericRepository.Instance.Find<BuyerOrder>(b => b.ID == 2).FirstOrDefault();
orders.Price = 397809;
GenericRepository.Instance.Save(); 
if (!Context.GetTable<T>().IsAttached(value))
{
    Context.GetTable<T>().Attach(value);
}
Context.Refresh(RefreshMode.KeepCurrentValues, value);
Context.SubmitChanges();