N-Tiered LinqToSql问题

时间:2009-04-07 14:17:25

标签: linq-to-sql n-tier-architecture

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

public override IEnumerable(memberState)GetMembersByState(string @state)
{
使用(BulletinWizardDataContext context = DataContext)
{
IEnumerable(memberState)mems =(来自上下文中的m。成员
在上下文中加入ma.MemberAddresses
on m.UserId等于ma.UserId
在上下文中加入。状态
在ma.StateId等于s.StateId
其中s.StateName == @state
选择新成员国
{
userId = m.UserID,
firstName = m.FirstName,
middleInitial = m.MiddleInitial,
lastName = m.LastName,
createDate = m.CreateDate,
modifyDate = m.ModifyDate
})ToArray的(memberState)();
返回mems;
}
}

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

谢谢,

3 个答案:

答案 0 :(得分:0)

如果我没记错的话,您可以从不同的表(Members,States和MemberAddresses)创建一个视图,并将其添加到数据上下文中。然后可以保存对视图对象中数据的任何修改,只要在数据库和数据上下文中都清楚地设置/定义了所有关系,linq到sql就会正确处理提交。

答案 1 :(得分:0)

如果您有一个Member表,dbml很可能包含一个Member类。要更新数据库中的成员,您必须创建一个新的Member对象,并将其附加到BulletinWizardDataContext.Members集合。类似于以下代码的东西应该是技巧(我还没有测试过代码):

using (BulletinWizardDataContext context = DataContext)
{
    Member m = new Member() { UserId = userId };
    context.Members.Attach(m);
    m.FirstName = firstName;
    // Set other properties
    context.SubmitChanges();
}

必须在设置属性之前调用Attach。此外,Linq2Sql在将对象的属性设置为默认值的情况下与Attach有一些问题(即0表示数值,false表示布尔值,null表示字符串等)。在这种情况下,Attach不会生成正确的SQL。

答案 2 :(得分:0)

var m = myContext.Members.Single(m=> m.UserID == myMemState.userID);
m.FirstName = myMemState.firstName;
m.MiddleInitial = myMemState.middleInitial;
...

那将是快捷的方式。它会对数据库进行额外的往返,但效果会很好。如果这对你来说是一个问题,那就像Jakob建议的那样做。为此,您必须执行一些额外的步骤,例如查看乐观更新的配置,并确保在执行附加时有原始字段。