Linq2SQL:未在datacontext中创建的更新对象

通常在更新linq2sql中的对象时,从datacontext获取对象并使用相同的datacontext来保存对象,对吧?

更新尚未被用于执行保存操作的datacontext检索的对象的最佳方法是什么,即我使用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.???? } } 

更新:使用不同的方法附件在这种情况下不起作用。 所以我想我需要一种基于reflection的方法。

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

Attach方法在桌面上 – 即

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

我想你有两个选择:

1)将对象附加到要进行保存的DataContext上2)使用对象上的主键,获取附加到上下文的实例(例如,执行FirstOrDefault()),然后从中复制数据修改后的对象到具有上下文的对象(这里reflection可能很有用)。

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

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

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

我的联接中的表(成员,状态和MemberAddresses是我的数据库中的实际表)。 我创建了对象memberStates,所以我可以在上面的查询中使用它(注意Select New memberState 。当在网页上更新数据时,如何将更改保留回成员表?我的成员表包含以下列:UserId,FirstName,MiddleInitial,LastName,CreateDate,ModifyDate。我不确定如何将更改保存回数据库。

谢谢,