【问题标题】:Model for ASP.NET MVCASP.NET MVC 模型
【发布时间】:2010-12-30 03:12:22
【问题描述】:

我刚开始使用 ASP.NET MVC 1.0。我已经阅读了一些教程,但我对如何构建我的模型没有任何好的想法。

我一直在试验 LINQ to SQL。不能说我喜欢它,但我会试一试。我更喜欢使用 SQL 存储过程,但它与我的存储过程中的可选参数一起似乎不太好。

该项目是一个原型,但我想立即从一个好的设计开始。

数据库可能包含大约 50 个表,存储过程将用于所有查询和更新。一些过程也会返回多个结果。如何设计这个模型的最佳方式?

欢迎所有和任何想法。我什至应该使用 LINQ to SQL 吗?我应该将存储过程设计为只返回一个结果吗?感觉有点失落。

【问题讨论】:

    标签: asp.net-mvc linq-to-sql model


    【解决方案1】:

    您可以在 LINQ 中使用存储过程。您只需用存储的过程替换实体上的自动生成语句。查看设计器中实体(表)的属性以更改这些属性。您的存储过程将无法返回多个结果,因为它们需要映射到您的一个实体或自动生成的实体的集合,即映射到单个类的集合。

    说了这么多,我还是试试不使用存储过程。 LINQ 代码是完全参数化的,因此您已经获得了这个好处。您会发现 LINQ 允许您轻松构建查询,从而减轻您对存储过程中可选参数的需求,并且可能会导致更高效的查询,因为您不需要在查询中构建额外的逻辑来处理可选参数参数。一旦您开始使用 LINQ,我想您会发现代码中的强大功能和表现力会让您忘记使用存储过程。

    对于复杂的查询,您可能仍然需要存储过程或表值函数——没关系。如果它们映射到现有实体,您只需将 proc/function 拖到设计器中的实体上,您就会在数据上下文中获得一个很好的方法,该方法运行您的 SQL 并返回该实体的集合。如果没有,我经常为 proc/function 模式创建一个视图,将其用作实体,并将 proc/function 附加到它。

    【讨论】:

      【解决方案2】:

      请问您为什么需要在这个项目中使用存储过程?如果您正在使用现代数据库,它们今天几乎没有任何价值。使用良好 ORM 的参数化 SQL 将为您提供与存储过程相同的缓存执行计划和安全优势。

      我会推荐NHibernate,因为它是实现持久性无知的更好方法。恕我直言,这是任何设计模型的人的目标。您应该首先考虑对象而不是数据。

      最好的资源是Steve BohlenThe summer of nhibernate”的截屏系列

      还有LINQ to NHibernate 可用,非常适合您可能需要编写的任何动态查询。

      您会注意到使用 NHibernate 的唯一痛苦是 XML,但如果您真的喜欢 ORM,您可以使用 FNH 编写流畅的界面。

      我发现 NHibernate 是对域进行建模的最佳工具,因为您的对象 100% 没有基础架构,这使您可以对它们做任何您想做的事情,而不必担心数据库。此外,如果您进行任何类型的单元测试,这将使您的生活更轻松:P

      编辑

      我回答您的问题的部分原因是我已经使用存储过程构建了许多系统,但后来发现我后悔这个决定。但在我的情况下,我有一个 dba 的要求,所以我不能脱离规范。

      如果您已经在研究 LINQ to SQL,我只是鼓励您将 NHibernate 视为实现持久性无知目标的另一个很好的选择。

      当我首先摆脱对问题数据的思考时,它使我能够在更高的层次上工作,并利用 .net 平台解决问题。 TSQL 有它的位置,但如果您正在编写一个应用程序并想要维护它 - 请尝试首先考虑您的域对象如何在内存中协同工作。

      编辑 2

      不知道为什么我对 NHibernate 的建议投了反对票——毕竟你说你对 L2S 以外的东西持开放态度

      “欢迎提出任何想法。我是否应该使用 LINQ to SQL?我应该将存储过程设计为只返回一个结果吗?我觉得有点失落。”

      我的回答的重点是——提供另一个“欢迎”的想法......

      【讨论】:

      • 就我个人而言,既然 LINQ 存在,我发现 nHibernate 的吸引力要小得多。对于很多人来说,LINQ-to-SQL 是一个非常好的 ORM
      • 当然,但是您现在可以做完全相同的事情,因为 NHibernate 有一个 LINQ 提供程序,它还有一个额外的好处是您可以使用更复杂的映射。例如:如果您的父数据与子数据位于单独的表中,那么 nhibernate 很酷。但是对于 LINQ to SQL,您必须将所有内容都放在一个表中。因此,对于这种需要更大灵活性或知道模型(或数据库)的复杂性很大的情况 - 恕我直言,NHibernate 是完成这项工作的更好工具。
      • 只有对你有用时才有用。如果您从不需要这些高级功能,那么它只是您必须跟上的另一个库。我可能永远不会将它添加到项目中,直到它明显有用为止。请注意,我对数据库也有同样的感觉。我认为对于许多企业 .net 项目(主要是美化的 CMS 和流程工具)来说,这可能是矫枉过正。我并不是说它不好或任何东西,它只是 LINQ 已经存在,并且在博客和 SO 上有很好的文档和很好的支持。因此,如果一个新手问我要使用哪一个,我可能会说 LINQ
      • 我更喜欢使用存储过程。这是让数据库专家专注于数据库操作和程序员专注于代码的好方法。我喜欢在代码中编写 LINQ 查询,就像在代码中编写 SQL 字符串一样。更糟糕的是,我认为在代码中有一些查询,在存储过程中有一些查询。我更喜欢将所有 SQL 收集在一个地方而不是代码中。
      • 我同意存储过程是邪恶的,知道什么更好吗?根本不使用 SQL 服务器。试试 CouchDB。
      猜你喜欢
      • 1970-01-01
      • 2012-10-07
      • 2015-02-26
      • 2011-05-02
      • 2019-01-10
      • 2010-12-28
      • 2010-12-07
      • 2013-05-20
      • 1970-01-01
      相关资源
      最近更新 更多