33

我刚刚开始使用 Linq to SQL,我想知道是否有人可以分享管理 dbml 文件的最佳实践。

  • 您如何使他们与数据库保持同步?
  • 您是否有整个数据库的单个 dbml 文件,还是将其拆分为多个逻辑单元?
  • 在团队环境中如何管理此文件?

欢迎任何其他提示和技巧。

4

5 回答 5

19

你看过SqlMetal吗?它得到了官方的支持,虽然没有过多地推广。您可以使用它从命令行构建 dbmls - 我们已将其用作 db 持续集成更新的一部分(如果您这样做,请确保您有非常好的代码分离 - 部分类是救世主 - 因为 dbml 会得到覆盖)。

如果我没记错的话,它与 Visual Studio 中的模型设计器没有完全相同的功能(我认为它处理复数的方式不同)。Ben Hall 的博客上有一篇关于它的好帖子

于 2008-08-31T10:21:21.397 回答
9

L2S 设计器不支持与数据库结构同步这一事实在我看来是一个巨大的限制。但是,有一个插件可以提供一些重新同步功能:

http://www.huagati.com/dbmltools/

不幸的是,它不再是免费的。

于 2008-08-28T23:46:23.387 回答
7

由于您询问了管理 DBML 的其他提示和技巧......

当 DBML 文件从数据库中刷新时,它们不会选择某些架构设置,例如默认列值,这会迫使您手动更改设置。这可能会导致您每次刷新 DBML 时浪费时间,而没有意识到或不记得您需要在哪里进行手动调整,并且您的代码开始失败。

为了防止这种情况,一个技巧是编写一个单元测试,它使用反射来检查那些(手动)设置的 LINQ 元数据。如果测试失败,它会给出描述性错误消息,指示用户对列属性进行适当的更改。这不是一个完美的解决方案,如果您有许多手动设置可能会不方便,但它可以帮助您避免您和您的团队的一些重大痛苦。

这是一个 nunit 测试示例,用于检查列是否设置为从数据库自动生成。

    [Test]
    public void TestMetaData()
    {
        MyObj my_obj = new MyObj()
        {
            Foo = "bar",
        };

        Type type = MyObj.GetType();
        PropertyInfo prop = type.GetProperty("UpdatedOn");
        IEnumerable<ColumnAttribute> info = (IEnumerable<ColumnAttribute>)prop.GetCustomAttributes(typeof(ColumnAttribute), true);
        Assert.IsTrue(
            info.Any<ColumnAttribute>(x => x.IsDbGenerated == true), 
            "The DBML file needs to have MyObj.UpdatedOn AutoGenerated == true set. This must be done manually if the DBML for this table gets refreshed from the database."
        );
    }
于 2009-11-24T15:05:54.340 回答
6

PLINQO 是一组生成 LINQ to SQL 的代码生成模板。它支持与数据库同步并将实体拆分为多个类以及许多其他使 LINQ to SQL 易于使用的功能。

查看http://www.plinqo.com上的 PLINQO 网站以及介绍视频。

于 2009-07-28T21:17:59.583 回答
2

这是提供有关 LINQ to SQL 最佳实践的良好信息的链接

http://www.a2zmenu.com/LINQ/LINQ%20to%20SQL%20Best%20Practice.aspx

于 2010-10-07T10:02:25.060 回答