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

时间:2008-12-16 14:20:41

标签: c# asp.net linq-to-sql

通常在更新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.????

        }
    }

更新:使用不同的方法在这种情况下,附加功能不起作用。所以我想需要一种基于反射的方法。

3 个答案:

答案 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。我不确定如何将更改保存回数据库。

谢谢,