我刚开始使用Linq to SQL,我想知道是否有人可以分享任何管理dbml文件的最佳实践。
欢迎任何其他提示和技巧。
答案 0 :(得分:19)
你看过SqlMetal了吗?它得到官方支持,虽然没有得到太多提升。您可以使用它来从命令行构建dbmls - 我们已经将它用作db的连续集成更新的一部分(如果你这样做,请确保你有很好的代码分离 - 部分类是一个救星 - 因为dbml会得到覆盖)。
如果我没记错,它与Visual Studio中的模型设计器没有完全相同的功能(我认为它处理多元化的方式不同)。有一个good post about it on Ben Hall's blog。
答案 1 :(得分:9)
L2S设计人员不支持与数据库结构同步这一事实在我看来是一个巨大的局限。但是,有一个可用的加载项提供了一些重新同步功能:
http://www.huagati.com/dbmltools/
不幸的是,它不再是免费的。
答案 2 :(得分: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."
);
}
答案 3 :(得分:6)
PLINQO是一组生成LINQ to SQL的代码生成模板。它支持与数据库同步并将实体拆分为多个类以及使LINQ to SQL易于使用的许多其他功能。
查看http://www.plinqo.com的PLINQO网站以及介绍视频。
答案 4 :(得分:2)
这是一个提供有关LINQ to SQL最佳实践的良好信息的链接
http://www.a2zmenu.com/LINQ/LINQ%20to%20SQL%20Best%20Practice.aspx