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

时间:2014-03-28 16:11:18

标签: c# entity-framework

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

我的表名都是单词之间带下划线的大写字母。即ACCOUNT_BALANCE

所有列名都是单词之间带下划线的大写字母:即FULL_NAME

我的主键都以PK_或PFK_为前缀:即PK_ACCOUNT_BALANCE

我的外键都以FK_为前缀:即FK_ACCOUNT

我有一个庞大的数据库要设置,所以我想使用数据库中的' Code First'使用自动映射器将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文件中,我用新的替换了include的引用(<#@ include file =" EF.Utility.CS-MMS.ttinclude& #34;#><#@)

之后,我浏览了Context.tt,Mapping.tt和Entity.tt文件,包含对code.ContextName(...),code.EntityName(...)和代码的上下文,实体和属性的引用。的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);
}

然后我右键点击了一个点击了“逆向工程师代码优先”的解决方案。生成类。

我有兴趣知道这是否是最佳方法。虽然看起来很稳固。

1 个答案:

答案 0 :(得分:2)

我认为EF晚于EF 4.3版本,它有一个功能 DbMigration 来处理遗留系统,以便在开发人员之间更改数据库。也许它可以在某种程度上帮助你。

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