在Database First中更改实体和属性名称

时间:2012-08-29 16:34:39

标签: c# entity-framework entity-framework-4 database-first ef-database-first

我正在启动一个必须使用现有数据库的新应用程序,该数据库使用一些在.net中非常烦人的命名约定(表名以几个指定表的业务域的三元组开头,列名以表开头trigram,trigrams是大写的,由下划线等分隔。)。

我想要做的是编写一个简单的重命名规则(这很简单,就像查找最后一个下划线并在此之后采取所有内容)并将其应用于实体框架中。我真的不想在编辑器中逐个编辑名称,特别是因为数据库可能会改变,我不想多次这样做。

我正在使用Database First(因为数据库已经存在并且它是“主人”),而且EF 4.x DbContext Generator它开箱即用(虽然命名很糟糕的类和属性)。

我编辑了T4模板以重命名生成的实体和属性,但是当我尝试执行任何请求时,DbContext对象找不到与我尝试请求的实体匹配的表,我得到了这个例外:

  

实体类型[实体名称]不是模型的一部分   目前的背景。

这显然是为什么它找不到表:没有什么告诉它如何匹配实体名称和表,因为我在运行中更改它。 我读到我可以在OnModelCreating(DbModelBuilder modelBuilder)方法中添加指令,但这不在Database First中使用(默认的T4模板在其中添加了一个例外,以防万一)。

所以现在我卡住了,我不知道如何指定匹配。

以下是我的几个想法,但不确定它是否正确或可行:

  • 使用“复数/单数”API更改实体的名称?听起来像一个肮脏的解决方法。但它可能会起作用(尽管没试过)。
  • 找到一种即时编辑EDMX文件的方法。
  • 之后编辑EDMX但它可能会使过程复杂化(在设计器中编辑,然后执行一个工具来改变EDMX,然后运行自定义工具来重新生成实体和DbContext ......而今天我只需要在设计器中编辑)。
  • 使用Code First(因为使用不同的实体名称比通过DbContext类中的属性或指令更容易使用不同的实体名称),但听起来将它与现有数据库一起使用并不会更复杂。

有什么想法吗?或者我错过了什么?

1 个答案:

答案 0 :(得分:8)

您将无法使用T4转换,因为您希望更改实际.edmx文件的内容,以将商店实体名称(带有令人讨厌的前缀)映射到已清理的概念实体名称。 / p>

相反,您最好编写一个以.edmx文件作为输入的应用程序,并清理概念模型标记下的名称,并修改映射名称以反映已清理的名称。我知道这是你的第三个选择,你想尽可能避免这种情况,但这是最直接的方法。请记住,添加新表或列时只需运行此工具。