【问题标题】:Custom name mapping using Code First From Database使用数据库中的 Code First 自定义名称映射
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

  • 谢谢。这种方法对我有用。我将在我最初的问题中提供有关解决方案的更多细节。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-17
  • 1970-01-01
  • 1970-01-01
  • 2022-01-12
  • 2012-03-29
  • 1970-01-01
  • 2014-01-18
相关资源
最近更新 更多