【问题标题】:EntityTypeBuilder does not contain a definition for ToTable in EF CoreEntityTypeBuilder 不包含 EF Core 中 ToTable 的定义
【发布时间】:2017-08-29 05:42:26
【问题描述】:

我有这个示例代码:

using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using Models;

namespace MySampleNamespace
{
    public class MyDbContext : DbContext
    {
        public MyDbContext(DbContextOptions<MyDbContext> options)
            : base(options)
        {
        }

        public DbSet<User> Users { get; set; }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            new UserMap(modelBuilder.Entity<User>());
        }

        public class UserMap
        {
            public UserMap(EntityTypeBuilder<User> entityBuilder)
            {
                entityBuilder.ToTable("User");
                entityBuilder.Property(s => s.Username).HasMaxLength(15).IsRequired();
            }
        }
    }
}

我正在测试 MS 网站上的一些示例,但我找不到 ToTable 方法。在示例中,我检查了 Using 是什么,除了他正在使用的模型的类项目之外,该示例中唯一的 Using 是 Microsoft.EntityFrameworkCore。这是改变了吗?我现在该怎么做?

【问题讨论】:

  • 确保您引用了 Microsoft.EntityFrameworkCore.Relational 程序集。使用没问题 - 有问题的方法是在该程序集中 Microsoft.EntityFrameworkCore 命名空间下的 RelationalEntityTypeBuilderExtensions 类中定义的扩展方法。

标签: entity-framework entity-framework-core


【解决方案1】:

正如 Ivan 所说,安装 Microsoft.EntityFrameworkCore.Relational 是正确的解决方案。

【讨论】:

【解决方案2】:

您应该添加 nuget 包 Microsoft.EntityFrameworkCore.SqlServer,因为这是 Microsoft SQL 方法。

【讨论】:

    【解决方案3】:

    我有这个问题,但不需要安装:

    Microsoft.EntityFrameworkCore.Relational
    

    我只是退出了 VS 2017 并重新打开了我的解决方案。 我安装了以下 NuGet 包:

    Microsoft.EntityFrameworkCore
    Microsoft.EntityFrameworkCore.Tools
    

    以及以下 CLI 工具参考:

    Microsoft.EntityFrameworkCore.Tools.DotNet
    

    【讨论】:

      【解决方案4】:

      对于net core 3.1,需要安装这些包:

      Microsoft.EntityFrameworkCore
      Microsoft.EntityFrameworkCore.Relational
      

      【讨论】:

        【解决方案5】:

        从 EF6 移植到 EFCore,我们遇到了这个问题。我们的原因是 .HasKey 现在返回 KeyBuilder 并且 .ToTable 不对其进行操作。因此,逆转这一点奏效了。

        即。是:

        mp.HasKey(m => m.Id)
          .ToTable("Table")
        

        成为:

        mp.ToTable("Table")
          .HasKey(m => m.Id);
        

        【讨论】:

        • 现在工作,这是给我的。
        【解决方案6】:

        Ivan 和 Mardoxx 是正确的。

        我尝试只安装 Microsoft.EntityFrameworkCore.Tools 然后收到此错误:

        检测到包降级:Microsoft.EntityFrameworkCore 从 2.1.4 到 2.1.1。直接从项目中引用包以选择不同的版本。 -> Microsoft.EntityFrameworkCore.Tools 2.1.4 -> Microsoft.EntityFrameworkCore.Design 2.1.4 -> Microsoft.EntityFrameworkCore.Relational 2.1.4 -> Microsoft.EntityFrameworkCore (>= 2.1.4) -> Microsoft.EntityFrameworkCore (>= 2.1.1)

        1. 我通过 nuget 升级了 Microsoft.EntityFrameworkCore
        2. 我确实安装了 Microsoft.EntityFrameworkCore.Tools,但它不适用于 ToTable,不知道是否需要这样做
        3. 然后我安装了Microsoft.EntityFrameworkCore.Relational,现在可以解决了

        【讨论】:

        • 我也按照你的步骤,从 netcoreapp2.1 升级了 netcoreapp3.0 现在 Microsoft.EntityFrameworkCore.Tools 和 Microsoft.EntityFrameworkCore.Relational 已成功安装,但使用语句未显示Microsoft.EntityFrameworkCore 之后的“关系”命名空间,因此我无法使用 MapToStoredProcedures :S
        【解决方案7】:

        对于 EFCore 3.1,我需要在我的数据库上下文中使用它:

        protected override void OnModelCreating(ModelBuilder modelBuilder)
            {
                base.OnModelCreating(modelBuilder);
        
                foreach (IMutableEntityType entity in modelBuilder.Model.GetEntityTypes())
                {
                    entity.SetTableName("WS_" + entity.GetTableName());
                }
            }
        

        不需要额外的 Nuget 包。

        【讨论】:

          【解决方案8】:

          确保在“默认项目”下拉列表中选择了正确的项目,然后键入以下命令:

          install-package microsoft.entityframeworkcore.sqlserver
          

          【讨论】:

            【解决方案9】:

            安装

            • Microsoft.EntityFrameworkCore,
            • MicrosoftEntityFramworkCore.Tools,最后是
            • Microsoft.EntityFrameworkCore.SqlServer

            【讨论】:

              【解决方案10】:

              对我来说,我的问题是我试图错误地调用 ToView()。

              我在做:

               modelBuilder.Query<Vendor>(entity =>
                      {
                          entity.Property(v => v.VendorId).HasColumnName("VendorID");
                          entity.Property(v => v.Name).HasColumnName("Vendor Name");                
                      }).ToView("vwVendors");
              

              代替:

              modelBuilder.Query<Vendor>(entity =>
                      {
                          entity.ToView("vwVendors");
                          entity.Property(v => v.VendorId).HasColumnName("VendorID");
                          entity.Property(v => v.Name).HasColumnName("Vendor Name");                
                      });
              

              【讨论】:

                【解决方案11】:

                您的解决方案中也可能存在版本差异,例如,如果您的依赖链中的一个项目具有 3.1 版本的 EF Core 而另一个项目具有 2.1,那么您还将看到这个错误,无论你安装什么它都不起作用,而是确保它们在整个解决方案中是相同的版本。

                【讨论】:

                  【解决方案12】:

                  取决于您使用的 .Net 版本。 Microsoft.EntityFrameworkCore.Tools.DotNet 仅支持 .NetStandard >= 2.0。

                  如果您的 .Net 版本是 4.6.1,请将 Microsoft.EntityFrameworkCore 更新为 2.0.0-preview1-final 以及相关的 EntityFramework DLL,然后关闭 Visual Studio 2017 并重新打开。

                  【讨论】:

                    猜你喜欢
                    • 2021-05-28
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2019-05-22
                    • 1970-01-01
                    • 1970-01-01
                    • 2021-07-12
                    相关资源
                    最近更新 更多