实体框架6 - 数据库优先 - 删除带有前缀的表名称

时间:2016-05-03 21:13:03

标签: c# asp.net .net entity-framework entity-framework-6

我有一个包含前缀

的表的现有数据库

离)   - px_mytable1   - tx_mytable1

当我使用实体框架从我的数据库生成模型时,前缀包含在模型名称中。

离)   - 公共部分类px_mytable1   - 公共部分类tx_mytable1

如何配置实体框架以从模型名称中删除前缀?

注意:我正在使用.edmx文件从数据库架构生成模型。

2 个答案:

答案 0 :(得分:2)

您必须对t4模板文件(.tt)进行一些更改。 首先在yourModelName.tt文件中创建一个如第5,6,7 ... 13行所示的变量

var tablePerfix="px_";

在此文件中搜索并查找      <#=codeStringGenerator.NavigationProperty(navigationProperty)#> 并将其替换为

<#=codeStringGenerator.NavigationProperty(navigationProperty).Replace(tablePerfix,"")#>
foreach (var entity in typeMapper.GetItemsToGenerate<EntityType>
(itemCollection))
{
    fileManager.StartNewFile(entity.Name + ".cs");
    BeginNamespace(code);
#>

将其替换为

foreach (var entity in typeMapper.GetItemsToGenerate<EntityType>
(itemCollection))
{
    fileManager.StartNewFile(entity.Name.Replace(tablePerfix,"") + ".cs");
    BeginNamespace(code);

并为以下代码执行此操作

<#=codeStringGenerator.EntityClassOpening(entity).Replace(tablePerfix,"")#>
// ...
public <#=code.Escape(entity).Replace(tablePerfix,"")#>()
// ...
this.<#=code.Escape(navigationProperty).Replace(tablePerfix,"")#> = new HashSet<<#=typeMapper.GetTypeName(navigationProperty.ToEndMember.GetEntityType()).Replace(tablePerfix,"")#>>();

如果数据库中的表有2个前缀,则应为每个前缀使用Replace方法两次

最后,yourModelName.Context.tt文件创建tablePrefix变量并更改以下代码

<#=codeStringGenerator.DbSet(entitySet)#>

<#=codeStringGenerator.DbSet(entitySet).Replace(tablePerfix,"")#>

答案 1 :(得分:-1)

您可以使用流畅的API或数据注释来配置您的类,以便Code First可以映射表之间的关系。一种方法是 覆盖OnModelCreating类的DbContext方法,在那里可以将类映射到数据库表名

protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Class1>().ToTable("Table1");
        modelBuilder.Entity<Class2>().ToTable("Table2");
        modelBuilder.Entity<Class3>().ToTable("Table3");

        base.OnModelCreating(modelBuilder);
    }

This link may help you