Linq2SQL:更新对象不是在datacontext中创建

问题描述:

通常,当您更新linq2sql中的对象时,您会从datacontext获取对象并使用相同的datacontext保存对象,对不对?Linq2SQL:更新对象不是在datacontext中创建

什么是最好的方式来更新一个对象,还没有被你用来执行保存操作datacontext retreived,即我使用flourinefx flex和asp.net之间传递数据,当对象从要保存的客户端我不知道如何保存该对象?

public static void Save(Client client) 
    { 
     CompanyDataContext db = new CompanyDataContext(); 
     Validate(client); 
     if(client.Id.Equals(Guid.Empty)) 
     { 
      //Create (right?): 
      client.Id = Guid.NewGuid(); 
      db.Clients.InsertOnSubmit(client); 
      db.SubmitChanges(); 
     } 
     else 
     { 
      //Update: 
      OffertaDataContext db = new OffertaDataContext(); 
      db.Clients.???? 

     } 
    } 

更新:不同的方法来使用在这种情况下附加doens't工作。所以我想要一个基于反射的方法是必需的。

要更新现有但断开连接的对象,您需要“附加”它执行数据上下文。这将重新使用现有的主键等。您可以控制如何处理更改 - 即将其视为脏处理,或视为清洁并跟踪将来的更改等。

附加方法在表上 - 即

ctx.Customers.Attach(customer); // optional bool to treat as modified 
+2

+1,另外:在“可选布尔治疗修改'只适用于存在TimeStamp字段或指定不检查DBML中的更新。我在此使用另一种解决方案:http://www.singingeels.com/Blogs/Nullable/2009/01/09/How_to_Make_LINQ_to_SQL_Check_for_Changes_After_Attach_or_AttachAll 。 aspx – 2009-01-09 16:17:03

我认为你有2个选择在这里:

1)将物体到DataContext上,你会尽你节省 2)使用你的对象的主键,抢是连接到一个实例的上下文(例如,执行FirstOrDefault()),然后将数据从修改的对象复制到具有上下文的对象(反射在此处可能很有用)。

Rick Strahl在http://www.west-wind.com/weblog/posts/134095.aspx上有一篇关于将实体附加到上下文的非常好的博客文章,特别是关于您可能遇到的一些问题。

我希望你能帮上忙。我正在开发一个使用Linq to Sql的分层网站。我在DBML设计器中创建了一个名为memberState的新类(或对象)。该对象不是数据库中的实际表格。我有这个方法在我的中间层:

public override IEnumerable(memberState) GetMembersByState(string @state)<br/> 
{<br/> 
using (BulletinWizardDataContext context = DataContext)<br/> 
{<br/> 
IEnumerable(memberState) mems = (from m in context.Members<br/> 
join ma in context.MemberAddresses<br/> 
on m.UserId equals ma.UserId<br/> 
join s in context.States<br/> 
on ma.StateId equals s.StateId<br/> 
where s.StateName == @state<br/> 
select new memberState<br/> 
{<br/> 
userId = m.UserID,<br/> 
firstName = m.FirstName,<br/> 
middleInitial = m.MiddleInitial,<br/> 
lastName = m.LastName,<br/> 
createDate = m.CreateDate,<br/> 
modifyDate = m.ModifyDate<br/> 
}).ToArray(memberState)();<br/> 
return mems; 
} 
} 

的表格中我加入(成员,各国和MemberAddresses都在我的数据库中的实际表)。我创建了对象memberStates,因此我可以在上面的查询中使用它(请注意选择新成员状态。当网页上的数据更新时,如何将更改持久化回成员表?我的成员表包含下列:用户ID,名字,MiddleInitial,姓氏,CREATEDATE,ModifyDate我不知道怎么回将更改保存到数据库中

感谢,

+2

为什么不在SO上创建它自己的问题?这样你会得到更多更好的答案! 无论如何......当持久存储数据时,您需要获取成员并使用您的membertate实例中已更改的值并更新该值。 – 2009-04-08 08:35:00