【发布时间】:2014-03-31 04:25:47
【问题描述】:
我正在考虑从 LLBLGen ORM 迁移到实体框架。我想使用自定义命名约定来映射数据库列名。
我的表名都是大写的,单词之间有下划线。即 ACCOUNT_BALANCE
所有列名都是大写,单词之间有下划线:即 FULL_NAME
我的主键都以 PK_ 或 PFK_ 为前缀:即 PK_ACCOUNT_BALANCE
我的外键都以 FK_ 为前缀:即 FK_ACCOUNT
我有一个庞大的数据库要设置,所以我想使用“数据库中的代码优先”方法和自动映射器将 ACCOUNT_BALANCE 转换为 AccountBalance,将 FULL_NAME 转换为 FullName,PK_ACCOUNT_BALANCE 转换为 PkAccountBalance 等。
我不介意弄脏手并进入 EF 源,但我目前正在努力寻找有关最佳方法的任何指导。
非常感谢任何帮助。
解决方案
minhcat_vo 下面的解决方案让我开始了。之后,我在 VS 中右键单击解决方案,单击“实体框架 -> 自定义逆向工程师模板”以将自定义模板添加到项目中。
然后我创建 [Program Files]\VisualStudio\Common7\IDE\Extensions\Microsoft\Entity Framework Tools\Templates\Includes\EF.Utility.CS.ttinclude 的副本(在同一个文件夹中)
然后在 Context.tt、Entity.tt 和 Mapping.tt 文件中,我将对包含的引用替换为新的 (
之后,我浏览了 Context.tt、Mapping.tt 和 Entity.tt 文件,这些文件使用 code.ContextName(...)、code.EntityName(...) 和代码包装了对上下文、实体和属性的引用。属性名(...)
然后在新的 EF.Utility.CS.ttinclude 文件中,我添加了这些方法和一个 PascalCase 方法:
public string PascalCase(string name)
{
return name == null || name.Length == 0
? ""
: name.Length == 1
? name.ToUpperInvariant()
: String.Join("",
name.Split('_')
.Select(part => Char.ToUpperInvariant(part[0]) + part.Substring(1).ToLowerInvariant() )
);
}
public string ContextName(string name)
{
return PascalCase( name.Substring(0,name.Length - "Context".Length) ) + "Context";
}
public string EntityName(string name)
{
return PascalCase(name);
}
public string PropertyName(string name)
{
return PascalCase(name);
}
然后我右键单击解决方案并单击“逆向工程师代码优先”以生成类。
我很想知道这是否是最好的方法。不过它看起来很坚固。
【问题讨论】:
-
好吧,您总是可以手动完成(使用数据注释)。但也许您应该考虑更改数据库内部的命名?我认为下划线和全大写名称的日子终于过去了:D
-
手动为 100 个表执行此操作是不可行的,而且它是一个实时系统,因此仅更改数据库模式不是一种选择(并且容易出错)。 “我认为下划线和全大写名称的时代终于过去了”——的确,但这是一个无法更改的遗留系统。
-
你用的是什么版本的EF?
-
您可以按照here 所述使用自定义约定。
-
修改t4模板的缺点是升级模板时必须重新做。我会去自定义代码约定。干净多了。
标签: c# entity-framework