通常在更新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.????
}
}
更新:使用不同的方法在这种情况下,附加功能不起作用。所以我想需要一种基于反射的方法。
答案 0 :(得分:6)
要更新现有但已断开连接的对象,您需要“附加”它来执行数据上下文。这将重新使用现有的主键等。您可以控制如何处理更改 - 即视为脏,或视为干净并跟踪未来的更改等。
Attach方法在桌面上 - 即
ctx.Customers.Attach(customer); // optional bool to treat as modified
答案 1 :(得分:4)
我认为你有两个选择:
1)将对象附加到要进行保存的DataContext 2)使用对象上的主键,获取附加到上下文的实例(例如,执行FirstOrDefault()),然后将数据从修改后的对象复制到具有上下文的对象(反射可能有用)这里)。
Rick Strahl有一篇非常好的博客文章,关于将实体附加到http://www.west-wind.com/weblog/posts/134095.aspx的上下文,特别是关于您可能遇到的一些问题。
答案 2 :(得分:0)
我希望你能提供帮助。我正在开发一个使用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;
}
}
我的联接中的表(成员,状态和成员地址是我的数据库中的实际表)。我创建了对象memberStates,所以我可以在上面的查询中使用它(注意选择新的memberState 。当在网页上更新数据时,如何将更改保留回成员表?我的成员表由以下列组成:UserId,FirstName,MiddleInitial,LastName,CreateDate,ModifyDate。我不确定如何将更改保存回数据库。
谢谢,