2012-04-13 62 views
0

只是想了解什么是使用linq2sql更新实体的最佳做法?在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

回答

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

这是正确的答案。永远不要分开你的实体,不要玩技巧。不要“保存”个体实体。整体更改对象图形,最后调用SaveChanges。 – usr 2012-04-13 13:17:47

+0

谢谢你的答案。但是我怎样才能定义这个实体是连接到上下文的呢?我想在1方法中处理两种情况:当实体附加到上下文时,并且它不是时 – 2012-04-16 16:44:36

+0

您可以使用此问题中概述的答案来定义实体是否已附加:http://stackoverflow.com/questions/6493737/how-do-i-check-an-lin-to-sql-object-is-attached-to-a-datacontext – mattytommo 2012-04-16 17:11:58

1

可以检查实体是否连接这样的:

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

对不起,也许我误解了smth。我没有看到Context的方法IsAttched。 – 2012-04-16 16:43:48

相关问题