【问题标题】:update DB from layered architecture: best approach?从分层架构更新数据库:最好的方法?
【发布时间】:2010-10-16 15:40:08
【问题描述】:

我已经构建了一个基本的 DAL,它可以使用这个 DAL 检索数据和一个包含多个对象的业务层。一旦我将数据映射到业务对象并对其进行了处理,我还想将数据写回数据库。一些业务对象有很多属性,因此将业务对象的每个值都作为参数传递给相应数据服务的方法是不可能的。

我一直在考虑的其他方式:

  1. 将业务对象传递给相应的数据服务,在那里执行一个将所有值作为参数的SP。 - 糟透了,因为我必须将业务对象传递给 DAL(违反分离)并且可能最终得到具有 >50 个参数的 SP

  2. 在业务对象中创建一个空 (?) 数据集,用业务对象中的值填充它,将该数据集传递给数据服务并通过数据适配器更新数据库。我想用“... WHERE 0”-SQL 字符串创建一个空数据集。这是一个好习惯吗?

这是我第一次做这样的事情。后者对我来说听起来更好,但也许还有其他更好的方法?还是由于某些我不知道的原因,第一个更好?

非常感谢!

[edit:] 我不能使用 LinQ2SQL,因为我使用 C# Express(它只支持查询本地数据库,而我的是远程数据库)

【问题讨论】:

    标签: c# database data-access-layer


    【解决方案1】:

    为什么您认为将业务对象传递给 DAL 时违反了分离。也许您应该考虑将业务对象分离到另一层。

    您也可以尝试 linq2SQL,这样您就可以忘记参数,这将减少您的 SP 的数量。

    【讨论】:

      【解决方案2】:

      您没有提到使用 LINQ。那是因为您还没有使用 .NET 3.5?

      此外,您不必将 DAL 设为通用。 DAL 的调用者不会尝试更新业务对象的所有属性,是吗?他们可能想要更新其中的一部分,因此您应该提供一个执行此操作的 API。例如,他们可能只想将地址添加到联系人对象,或者甚至可能更新电话号码。您需要在执行调用者真正尝试执行的操作与执行此操作所需的单独方法的数量之间进行权衡。

      【讨论】:

      • 我没有使用 LinQ,因为我使用 c# express(它只允许 LinQ 到本地 DB),我的(SQL Express)服务器是远程服务器。
      • 很抱歉听到这个消息。实体框架有效吗?看来您可以使用本地数据库进行开发,然后将连接字符串更改为具有相同架构的远程数据库。
      【解决方案3】:

      除非您的数据访问层非常通用,否则传递业务对象会很糟糕?

      我喜欢序列化对象并将 XML 传递到存储过程,但我可能会是少数。

      【讨论】:

      • 传递 XML 可能会变得非常昂贵,不确定 SQL 现在如何,但 SQL 2000 一次只能处理一定数量的 xml dom。除非您要将对象另存为 Xml,否则不要将其作为 Xml 传递给数据层。
      • 我不认为 SQL Server 2005 和 2008 仍然受到这种限制。 2005 年引入了 XML 数据类型和 nvarchar(max)。
      • 是的,2005 及更高版本具有对 xml 的本机支持。我仍然发现它是插入整个对象或对象列表的最佳方式(除了 BCP) - 如果您更改对象,则更改存储的过程而无需接触 DAL。
      【解决方案4】:

      将您的对象传递到您的 DAL。如果您手动编写 DAL 层,您的 DAL 层应该知道如何获取实体并将其保存到数据库,以及如何从数据库返回实体。 DAL 是关于您的实体对非易失性介质的持久性。

      【讨论】:

        【解决方案5】:

        DAL 应该是关于您的业务对象和特定数据表示之间的映射。这就是为什么使用域对象的存储库模式允许您切换到不同的持久性实现,甚至可能不是数据库。

        您担心需要向 DAL 的方法传递太多参数,然后举一个您只需要传递 2 或 3 个值的示例。如果是这种情况,将其作为方法的参数传递是合理的。如果要传递更多值,实现它的一种方法是定义一个包含要保存的值子集的接口。这样您就可以清楚地指定该方法将处理的信息。

        不管上述情况如何,都不要让方法过于具体,因为你最终会得到很多组合,这会使维护变得更加困难。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-09-11
          • 1970-01-01
          • 2011-08-30
          • 2010-10-07
          • 2016-08-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多