题
我刚刚开始使用 Linq to SQL,我想知道是否有人可以分享管理 dbml 文件的最佳实践。
- 如何让他们保持最新的数据库?
- 您是否有整个数据库的单个 dbml 文件,还是将其拆分为多个逻辑单元?
- 在团队环境中如何管理此文件?
欢迎任何其他提示和技巧。
解决方案
你看过吗 Sql金属?它得到了官方支持,尽管没有推广太多。您可以使用它从命令行构建 dbml - 我们已将其用作数据库持续集成更新的一部分(如果您这样做,请确保您有很好的代码分离 - 部分类是救世主 - 因为 dbml 将得到被覆盖)。
如果我没记错的话,它与 Visual Studio 中的模型设计器没有完全相同的功能(我认为它以不同的方式处理多元化)。有一个 Ben Hall 的博客上有一篇关于它的好文章.
其他提示
L2S 设计器不支持与数据库结构同步这一事实在我看来是一个巨大的限制。但是,有一个可用的插件可以提供一些重新同步功能:
http://www.huagati.com/dbmltools/
不幸的是,它不再免费了。
既然您询问了管理 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."
);
}
PLINQO 是一组生成 LINQ to SQL 的代码生成模板。它支持与数据库同步、将实体拆分为多个类以及许多其他使 LINQ to SQL 易于使用的功能。
查看 PLINQO 网站: http://www.plinqo.com 以及介绍视频。
以下链接提供了有关 LINQ to SQL 最佳实践的详细信息
http://www.a2zmenu.com/LINQ/LINQ%20to%20SQL%20Best%20Practice.aspx