【问题标题】:Entity Framework 6 - Database First - Remove table names with prefixesEntity Framework 6 - Database First - 删除带前缀的表名
【发布时间】:2016-05-03 21:13:02
【问题描述】:

我有一个现有的数据库,其中的表带有前缀

例如) - px_mytable1 - tx_mytable1

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

例如) - 公共部分类 px_mytable1 - 公共部分类 tx_mytable1

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

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

【问题讨论】:

  • 您是使用数据库优先的方法,将所有内容导入 edmx 文件,还是先使用工具进行逆向工程来编码?如果备选方案 1,应该有一些从数据库模型生成模型的 edmx 子文件,可以更改这些子文件以生成不同庄园的东西。如果备选方案 2,您可以添加自己的映射类,因此在代码优先模型和您的数据库字段之间进行映射。文档:msdn.microsoft.com/en-us/data/jj591617.aspx
  • 可能重复:stackoverflow.com/questions/34088641/… 或至少是自定义“公约”的介绍!
  • @granadaCoder 不是代码优先吗?
  • 您在原始问题中没有提到 edmx。仅供参考,我不知道有人再使用 edmx。 Poco/Fluent-Mapper 就是这么干净恕我直言。
  • 是的。 edmx 对概念证明很有用……但是一旦“真实”出现,它们就很难打开和管理。学习(恕我直言)poco 映射的最佳方法是使用一个小型数据库(您很清楚)(或创建一个具有 1:N、M:N(关系上没有属性)、M:N(关系上的属性)的数据库) ), 一个查找表........和反向 poco 工程它。互联网搜索“实体框架反向 poco 生成器”我在大约 2 小时内了解了有关 poco 映射的更多信息,然后我准备了很多教程。

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


【解决方案1】:

您必须对 t4 模板文件 (.tt) 进行一些更改。 首先 o all 在 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);

应用.Replacy(tablePerfix,"") 如下所示从实体中删除前缀。

<#=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,"")#>

【讨论】:

  • 我知道这是旧的答案,甚至是 edmx 的解决方案,但我有 edmx 的项目。我想基于 db 生成模型,并将前缀“TBL_”替换为空字符串。我完成了上述所有步骤,但名称没有更改。我能错过什么?谢谢
  • 尝试再次执行这些步骤。我猜你没有在代码中应用你的更改。尝试右键单击和generate codes(不记得确切的名称)。如果您还有问题,请告诉我
  • 嗨!我用替换的前缀生成实体类,但在 edmx 模型中似乎没有修改表名
  • 它不会更改 edmx 模型中的表名,它会在 c# 自动生成的文件中更改它们。我不知道如何在 edmx 模型中更改它们。
  • edmx 可以改名字吗?
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2014-02-19
    • 1970-01-01
    • 1970-01-01
    • 2019-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-28
    相关资源
    最近更新 更多