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)将物体到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我不知道怎么回将更改保存到数据库中
感谢,
为什么不在SO上创建它自己的问题?这样你会得到更多更好的答案! 无论如何......当持久存储数据时,您需要获取成员并使用您的membertate实例中已更改的值并更新该值。 – 2009-04-08 08:35:00
+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