使用Code First From Database进行自定义名称映射

我正在考虑从LLBLGen ORM迁移到Entity Framework。 我想使用自定义命名约定来映射数据库列名称。

我的表名都是单词之间带下划线的大写字母。 即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中的解决方案,单击“entity framework – >自定义反向工程师模板”,将自定义模板添加到项目中。

然后我创建[Program Files] \ VisualStudio \ Common7 \ IDE \ Extensions \ Microsoft \ Entity Framework Tools \ Templates \ Includes \ EF.Utility.CS.ttinclude(在同一个文件夹中)的副本

然后在Context.tt,Entity.tt和Mapping.tt文件中,我用新的替换了include的引用( <#@)

之后,我通过Context.tt,Mapping.tt和Entity.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版本,它有一个functionDbMigration来处理遗留系统以改变开发人员之间的数据库。 也许它可以在某种程度上帮助你。

如果您已有现有数据库,则仍然首先使用代码。 您可以下载Visual Studio的EF Power Tool扩展。 它基本上生成您的实体模型,其关系是一个实体 – 一个表和所有地图文件。