【问题标题】:N-Tiered LinqToSql QuestionN-Tiered LinqToSql 问题
【发布时间】:2010-10-18 01:54:25
【问题描述】:

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

公共覆盖 IEnumerable(memberState) GetMembersByState(string @state)
{
使用 (BulletinWizardDataContext context = DataContext)
{
IEnumerable(memberState) mems = (来自 m in context.Members
在 context.MemberAddresses 中加入 ma
在 m.UserId 上等于 ma.UserId
在 context.States 中加入 s
在 ma.StateId 上等于 s.StateId
其中 s.StateName == @state
选择新会员国
{
userId = m.UserID,
名字 = m.名字,
middleInitial = m.MiddleInitial,
姓氏 = m.姓氏,
createDate = m.CreateDate,
modifyDate = m.ModifyDate
}).ToArray(memberState)();
返回内存;
}
}

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

谢谢,

【问题讨论】:

  • 我不认为您的应用程序是 N 层的这一事实对问题/问题有任何影响。

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    如果您有一个 Member 表,则 dbml 很可能包含一个 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();
    }
    

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

    【讨论】:

      【解决方案3】:
      var m = myContext.Members.Single(m=> m.UserID == myMemState.userID);
      m.FirstName = myMemState.firstName;
      m.MiddleInitial = myMemState.middleInitial;
      ...
      

      这将是快速的方法。它对数据库进行了额外的往返,但效果很好。如果这对您来说是个问题,那么请按照 Jakob 的建议进行附加。为此,您必须执行一些额外的步骤,例如检查配置以进行乐观更新,并确保在执行附加时拥有原始字段。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-16
        • 2011-04-10
        • 2021-12-10
        • 2015-12-24
        • 2010-12-03
        相关资源
        最近更新 更多