【问题标题】:(LINQ-To-SQL) Creating classes first, database table second, how to auto-connect the two?(LINQ-To-SQL)先创建类,再创建数据库表,如何自动连接两者?
【发布时间】:2009-09-08 23:21:21
【问题描述】:

我首先使用 LINQ-To-SQL 图形设计器通过右键单击->添加->类来创建数据模型。我的想法是,我将首先使用测试存储库设置所有内容,设计整个网站,然后作为最后一步,使用 LINQ-To-SQL 类作为数据库表和关系的模型创建一个数据库。我的理由是编辑类很容易,但修改数据库表很难(特别是如果其中已经有数据),所以最后做数据库部分,设计结构变得容易得多。

我的问题是,一旦我创建了数据库表,有没有一种自动的方法来链接这两者?我知道您可以手动填写 LINQ-To-SQL 实体的类属性,但如果您有很多表要处理,这将非常麻烦。另一种选择是删除您手动创建的类并将表从数据库拖到设计器中以自动生成类,但我不确定这是否是最好的方法。

【问题讨论】:

  • 为什么你认为修改数据库表很难?不确定您的问题的答案,但我使用设计器将表格从数据库拖到设计器。我还使用 sqlmetal 自动生成类。
  • 您确实需要重新考虑这种方法。如果你想做类优先设计,你应该使用像 NHibernate 这样更好地支持这一点的 ORM。我认为更改数据库并不难,保持代码和数据库同步是很困难的,一个好的 ORM 将大有帮助(LinqToSql 是这方面最糟糕的选择之一)。
  • Paul 和 Michael,当您没有数据时,编辑数据库表并不太难,但绝对不像打开一个类并添加一个新字段那么容易。但是,一旦您将数据添加到表中,根据我的经验,尝试修改大部分内容而不破坏某些内容是很痛苦的。因此,我想先设计整个应用程序,而数据库表将只是类的复制和粘贴。

标签: asp.net linq-to-sql


【解决方案1】:

Linq to Sql 旨在成为数据库上相对较薄的 ORM 层。虽然您当然可以将属性添加到数据上下文并将它们用作一种模拟,但您是对的,但使用起来并不容易。

您可能需要研究存储库设计模式,而不是仅仅依靠 Linq to Sql 生成的类来让您从数据库实现中解放出来。它允许您在数据库、域模型和中间层之间进行平滑分离;我现在已经在两个项目中使用了它,并且已经能够(在大多数情况下)自上而下地构建所有内容,将实际数据库留到最后。下面是一个关于该模式的优秀教程的链接(比我在这里写的要好)。

https://web.archive.org/web/20110503184234/http://blogs.hibernatingrhinos.com/nhibernate/archive/2008/10/08/the-repository-pattern.aspx

【讨论】:

  • 感谢 Dusda,但我已经在使用存储库模式将模型松散地耦合到控制器。但是,在这种情况下,我只是想找出是否有一种简单的方法可以将手动创建的类链接到在类本身之后创建的数据库表。
  • 可能,是的,但(根据我的经验)不是特别容易,甚至不值得。正如您所说,很难维护它们之间的更改,尤其是在对 DBML 进行更改然后将它们复制到实际数据库时。听起来您的架构偏好牢牢地存在于领域方面,因此为了适合您的风格,我会完全推荐一种替代方法。 Linq to Sql 是一个很薄的 ORM 层;看看 NHibernate 或者你自己的依赖注入自定义方法(我大量使用 Ninject 2.0 来解决这个问题)。
【解决方案2】:

根据您的数据库权限,您可能会调用 datacontext 的 DeleteDatabase() 和 CreateDatabase() 方法作为重新同步类和表的不优雅方式。当您在数据库中有实际数据时,这不是一个很好的选择,但在您处于开发阶段时确实有效。

【讨论】:

    【解决方案3】:

    看看我的插件(您可以从 http://www.huagati.com/dbmltools/ 下载,也可以从同一站点获得 45 天免费试用许可证)。

    它可以使用 SQL-DDL 语句生成 SQL-DDL 差异脚本,以仅使用 L2S 模型中已更改的部分(例如,添加缺失的列、缺失的表、缺失的 FK 等)而不是 L2S - 开箱即用的支持从头开始重新创建整个数据库。

    还支持其他方式同步;从数据库更新模型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多