使用代码优先从数据库自定义名称映射
本文关键字:自定义 映射 数据库 代码 | 更新日期: 2023-09-27 17:54:27
我正在考虑从LLBLGen ORM转移到实体框架。我想使用自定义命名约定来映射DB列名。
我的表名都是大写字母,单词之间有下划线。例如ACCOUNT_BALANCE
所有列名都是大写字母,单词之间有下划线:即FULL_NAME
我的主键都以PK_或PFK_为前缀:即PK_ACCOUNT_BALANCE
我的外键都以FK_为前缀:即FK_ACCOUNT
我有一个巨大的数据库设置,所以我想使用"代码首先从数据库"的方法与自动映射器将ACCOUNT_BALANCE转换为AccountBalance, FULL_NAME到FullName, PK_ACCOUNT_BALANCE到PkAccountBalance等。
我不介意自己动手去看EF源码,但是我目前正在努力寻找任何关于最佳方法的指导。
任何帮助都非常感谢。
<<p> 解决方案/strong>minhcat_vo下面的解决方案让我开始。之后,我右键单击VS中的解决方案,单击"实体框架->自定义逆向工程模板",将自定义模板添加到项目中。
然后我创建了一个副本[程序文件]'VisualStudio'Common7'IDE'Extensions'Microsoft'Entity Framework Tools'Templates'Includes'EF.Utility.CS。包含(在同一文件夹中)
Then in the Context。tt,实体。tt和映射。我将对包含的引用替换为新的引用(<#@ include file="EF.Utility.CS-MMS. html ")。ttinclude " #> & lt; # @)
之后,我浏览了Context。tt,映射。tt和实体。使用code.ContextName(…)、code.EntityName(…)和code.PropertyName(…)包装上下文、实体和属性引用的文件
然后在新的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);
}
然后我右键单击解决方案,单击"逆向工程代码第一"来生成类。
我很想知道这是否是最好的方法。我认为EF比EF 4.3版本晚,它有一个特性DbMigration来处理遗留系统在开发人员之间更改数据库。也许它能在某种程度上帮助你。
如果您已经有了现有的数据库,您仍然首先使用代码。您可以下载EF Power Tool Visual Studio扩展。它基本上用关系生成实体模型一个实体-一个表,以及所有映射文件。