在数据库优先模式下更改实体和属性名称

11

我正在开发一个新应用程序,必须使用现有数据库,该数据库使用一些在.NET中真正令人讨厌的命名约定(表名以指定表业务域的几个三字码开头,列名以表的三字码开头,三字码大写并用下划线分隔等)。

我想要做的是编写一个简单的重命名规则(这就像查找最后一个下划线并获取它后面的所有内容一样简单),并在Entity Framework中应用它。我不想逐个编辑编辑器中的名称,特别是因为数据库可能会更改,我不想多次执行此操作。

我正在使用Database First(因为数据库已经存在并且它是“主数据库”),以及EF 4.x DbContext Generator,它可以很好地工作(尽管类和属性的名称很糟糕)。

我编辑了T4模板以重命名生成的实体和属性,但是当我尝试执行任何请求时,DbContext对象无法找到与我尝试请求的实体匹配的表格,然后我收到以下异常:

实体类型[实体名称]不是当前上下文的模型的一部分。

显然,它找不到表:没有任何东西告诉它如何将实体名称与表匹配,因为我正在实时更改它。

我阅读了可以在OnModelCreating(DbModelBuilder modelBuilder)方法中添加指令,但这不适用于Database First(默认T4模板在其中添加了一个异常,以防万一)。

所以现在我被卡住了,我不知道如何指定匹配。 这里有几个想法,但不确定是否正确或可行:

  • 使用“复数/单数”API来更改实体的名称?听起来像是一个肮脏的解决方案。 但它可能有效(尚未尝试)。
  • 找到一种实时编辑EDMX文件的方法。
  • 编辑EDMX可能会使过程变得复杂(需要在设计器中进行编辑,然后执行工具以更改EDMX,接着运行自定义工具来重建实体和DbContext...而今天我只需在设计器中进行编辑)。
  • 使用Code First(因为似乎更容易使用不同的实体名称而非表名称,通过在DbContext类中使用属性或指令),但使用已有数据库似乎也不会更加复杂。
  • 有任何想法吗?或者是我漏掉了什么?

    1个回答

    8
    您无法使用T4转换来实现此目的,因为您希望更改实际的.edmx文件内容,以将存储实体名称(带有烦人的前缀)映射到已清理的概念实体名称。
    相反,最好编写一个应用程序,以.edmx文件为输入,并对概念模型标记下的名称进行清理,并修改映射名称以反映已清理的名称。我知道这是您的第三个选择,并且如果可能的话,您希望避免这种情况,但这是最直接的方法。请注意,只有在添加新表或列时才需要运行此工具。

    2
    我很害怕得到那个答案:)。我希望我错过了什么。看起来好像已经有人做了这个工具:http://blog.cincura.net/228749-making-names-of-entities-or-any-identifiers-in-entity-framework-model-code-and-developer-friendly-not-uppercase/。 - Julien N

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接