【问题标题】:Cannot find plural form of table找不到表格的复数形式
【发布时间】:2014-12-19 04:29:54
【问题描述】:

由于某种原因,代码优先的 EF7 (vNext) 不会使用/查找我的表格的复数形式。我已经尝试将表格属性添加到模型中,但它并没有解决问题。

[Table("Units")]
public class Unit

如果我将表命名为 Unit 则没问题。如果我将表命名为 Units,则找不到它。

我做错了什么或错过了什么?

谢谢。

【问题讨论】:

  • 您是否使用任何流畅的 API 配置?
  • @DavidG 通过 OnModelCreating no.
  • 我觉得属性可能还没实现,试试fluent api吧
  • @ErikEJ 据我了解,我可能不明白,流畅的 api 是在 OnModelCreating 覆盖中操作的。但是,这不再是 EF7 中的方法。
  • 是否包含正确的引用和命名空间:github.com/aspnet/EntityFramework/wiki/…

标签: entity-framework linq-to-entities entity-framework-core


【解决方案1】:

我就是这样解决的:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);

    modelBuilder.Entity<Unit>().ToTable("Units");
}

【讨论】:

  • 我很好奇,我遇到了一个非常相似的问题,由于 ToTable 不存在,您的解决方案似乎不起作用。你是如何实现这一目标的?
【解决方案2】:

对于Entity Framework 7 beta1,我通过这种方式解决了这个问题:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);
    modelBuilder.Entity<Unit>().ForRelational(rb =>
    {
        rb.Table("Units");
    });
}

【讨论】:

    【解决方案3】:

    Entity Framework 7 正在使用 Fluent API 进行配置。我创建了一个扩展方法,将表名映射到它们的复数形式,目的是重现 EF 6 的行为并能够在使用 EF7 时使用我现有的数据库。

    public static class ModelBuilderExtensions
    {
        public static void PluralizeNames(this ModelBuilder modelBuilder)
        {
            var types = modelBuilder.Model.EntityTypes;
    
            foreach (var type in types.Where(type => type.ClrType != null))
            {
                modelBuilder.Entity(type.ClrType)
                            .ForRelational()
                            .Table(type.ClrType.Name.Split('`')[0].Pluralize());
            };
        }
    }
    

    请注意.Pluralize() 扩展方法。这可能是您正在使用的 Humanizer 或任何其他使您的字符串复数的扩展方法。 (我无耻地在我的项目中复制了https://github.com/srkirkland/Inflector/blob/master/Inflector/Inflector.cs,以便能够使用 DNX Core 编译我的项目。)

    .Split() 部分用于处理type.ClrType.Name,它可以输出诸如IdentityUserRole`1之类的内容。

    你可以在你的DbContext中这样使用它:

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
    
        modelBuilder.PluralizeNames();
    }
    

    Ps;这对我有用

    【讨论】:

      【解决方案4】:

      现在 EF7 的 beta5 中缺少 ToTable 和 ForRelational。所以我使用了下面的代码。

             protected override void OnModelCreating(ModelBuilder builder)
              {
                  base.OnModelCreating(builder);
      
                  builder.Entity<Role>().ForSqlServer().Table("Role");
              }
      

      【讨论】:

        【解决方案5】:

        您需要在 project.json 中添加“Microsoft.EntityFrameworkCore.Relational”并恢复您的包。 .NET 核心被分解成小块以减少内存占用。所以你需要明确告诉你想要什么。

        【讨论】:

          猜你喜欢
          • 2014-07-19
          • 2021-03-13
          • 1970-01-01
          • 1970-01-01
          • 2013-05-12
          • 2017-07-31
          • 1970-01-01
          • 1970-01-01
          • 2015-09-07
          相关资源
          最近更新 更多