我的EF4模型中有许多实体,例如Contacts
,Calls
,ContactTypes
等。
当我生成模型的DB时,我得到具有相同命名的表名。
如何使用前缀ab_Contacts
,ab_Calls
等设置表名,但是在生成的代码中将实体保留为Contacts
和Calls
?
我无法在.edmx文件中找到指定方法。
答案 0 :(得分:2)
如果您先使用型号,则不需要这样。模型优先用于您对数据库没有要求的场景。
更改此行为需要更改EDMX的SSDL部分的生成过程(一旦您要求设计人员为您生成SQL,就会创建该过程)。默认情况下,此流程由工作流程(%VSINSTALLDIR%\Common7\IDE\Extensions\Microsoft\Entity Framework Tools\DBGen\TablePerTypeStrategy.xaml
)处理,如果您安装Database Generation Power Pack,则可由T4模板处理。您必须修改工作流程(实现一些自定义生成组件)或T4模板才能使用自定义命名约定。
修改强>
行。我决定自己尝试使答案完整,即使我认为指向正确的方法应该足够了。
安装Database Generation Power Pack时,您将在上述路径中安装一组新的模板和工作流。其中一个工作流程称为Generate T-SQL Via T4 (TPT).xaml
。此工作流与原始TablePerTypeStrategy.xaml
之间的区别在于,此工作流使用外部T4模板生成SSDL和MSL。您需要做的是创建此工作流的副本并将其放在同一目录中(您必须为其创建一个不同的名称)。您还必须为SSDL创建创建一个名为CSDLToSSDL_TPT.tt
的参考T4模板的副本,并将其放在同一目录(具有不同的名称)。获得.tt文件后,打开新的.xaml文件,将SSDL模板的路径更改为新模板(在VS中的设计器或任何文本编辑器中)。作为最后一步,您必须打开.tt文件的副本并更新EntitySet
元素创建:
foreach (EntityType entityType in edm.GetAllEntityTypes()) { #>
<EntitySet Name="<#=WriteEntityTypeName(entityType, edm)#>" EntityType="<#=ssdlModelNamespace#>.<#=WriteEntityTypeName(entityType, edm)#>" Table="prefix_<#=WriteEntityTypeName(entityType, edm)#>" store:Type="Tables" Schema="<#=databaseSchemaName#>" />
<# }
我添加了Table
属性,其名称指定为prefix_
(您可以将其替换为您自己的)。现在,您必须在从模型生成数据库>向导中选择新工作流并创建新的SQL脚本。
答案 1 :(得分:0)
在您的上下文中,您可以覆盖OnModelCreating(DbModelBuilder模型构建器)并执行以下操作:
modelBuilder.Entity<Contact>().ToTable("ab_Contact");
答案 2 :(得分:0)
你可以这样试试..
如果您只需要更改表格的名称,您可以:
<EntitySet Name="Customers" EntityType="ExampleModel.Store.Customers" Schema="dbo" />
。 Table="MyTableName"
属性。 <EntitySet Name="Customers" EntityType="ExampleModel.Store.Customers" Schema="dbo" Table="MyTableName" />
这是一个完整的CSDL, SSDL, MSL specification。
希望有所帮助。
答案 3 :(得分:0)
在EF6中,只需更改实体属性
中的实体集名称属性即可HTH 洛伦佐