在 SqlServer 提供程序清单中找不到存储类型“Varchar(100)”

Posted

技术标签:

【中文标题】在 SqlServer 提供程序清单中找不到存储类型“Varchar(100)”【英文标题】:The store type 'Varchar(100)' could not be found in the SqlServer provider manifest 【发布时间】:2020-07-04 01:08:57 【问题描述】:

我正在开发一个 MVC 4 项目,该项目使用 EF 6 进行所有进出数据库 (SQL Server) 的操作。我必须进行一些重构才能使用更明确的 Fluent API。基本上,现在项目中的每个实体都有对应所有映射的 Fluent API 代码。

当我尝试从包管理器控制台运行 EF 命令时出现问题。这是我得到的错误:

这是错误的完整日志:

PM> enable-migrations
Checking if the context targets an existing database...
System.InvalidOperationException: The store type 'Varchar(100)' could not be found in the SqlServer provider manifest
   at System.Data.Entity.Utilities.DbProviderManifestExtensions.GetStoreTypeFromName(DbProviderManifest providerManifest, String name)
   at System.Data.Entity.ModelConfiguration.Configuration.Properties.Primitive.PrimitivePropertyConfiguration.ConfigureColumn(EdmProperty column, EntityType table, DbProviderManifest providerManifest)
   at System.Data.Entity.ModelConfiguration.Configuration.Properties.Primitive.PrimitivePropertyConfiguration.<>c__DisplayClass47_0.<Configure>b__0(Tuple`2 pm)
   at System.Data.Entity.Utilities.IEnumerableExtensions.Each[T](IEnumerable`1 ts, Action`1 action)
   at System.Data.Entity.ModelConfiguration.Configuration.Types.StructuralTypeConfiguration.ConfigurePropertyMappings(IList`1 propertyMappings, DbProviderManifest providerManifest, Boolean allowOverride)
   at System.Data.Entity.ModelConfiguration.Configuration.Types.EntityTypeConfiguration.ConfigurePropertyMappings(DbDatabaseMapping databaseMapping, EntityType entityType, DbProviderManifest providerManifest, Boolean allowOverride)
   at System.Data.Entity.ModelConfiguration.Configuration.Types.EntityTypeConfiguration.Configure(EntityType entityType, DbDatabaseMapping databaseMapping, DbProviderManifest providerManifest)
   at System.Data.Entity.ModelConfiguration.Configuration.ModelConfiguration.ConfigureEntityTypes(DbDatabaseMapping databaseMapping, ICollection`1 entitySets, DbProviderManifest providerManifest)
   at System.Data.Entity.ModelConfiguration.Configuration.ModelConfiguration.Configure(DbDatabaseMapping databaseMapping, DbProviderManifest providerManifest)
   at System.Data.Entity.DbModelBuilder.Build(DbProviderManifest providerManifest, DbProviderInfo providerInfo)
   at System.Data.Entity.DbModelBuilder.Build(DbConnection providerConnection)
   at System.Data.Entity.Internal.LazyInternalContext.CreateModel(LazyInternalContext internalContext)
   at System.Data.Entity.Internal.RetryLazy`2.GetValue(TInput input)
   at System.Data.Entity.Internal.LazyInternalContext.InitializeContext()
   at System.Data.Entity.Internal.LazyInternalContext.get_ModelBeingInitialized()
   at System.Data.Entity.Infrastructure.EdmxWriter.WriteEdmx(DbContext context, XmlWriter writer)
   at System.Data.Entity.Utilities.DbContextExtensions.GetModel(Action`1 writeXml)
   at System.Data.Entity.Migrations.DbMigrator..ctor(DbMigrationsConfiguration configuration, DbContext usersContext, DatabaseExistenceState existenceState, Boolean calledByCreateDatabase)
   at System.Data.Entity.Migrations.DbMigrator..ctor(DbMigrationsConfiguration configuration)
   at System.Data.Entity.Migrations.Design.MigrationScaffolder..ctor(DbMigrationsConfiguration migrationsConfiguration)
   at System.Data.Entity.Infrastructure.Design.Executor.CreateMigrationScaffolder(DbMigrationsConfiguration configuration)
   at System.Data.Entity.Infrastructure.Design.Executor.ScaffoldInitialCreateInternal(DbConnectionInfo connectionInfo, String contextTypeName, String contextAssemblyName, String migrationsNamespace, Boolean auto, String migrationsDir)
   at System.Data.Entity.Infrastructure.Design.Executor.ScaffoldInitialCreate.<>c__DisplayClass0_0.<.ctor>b__0()
   at System.Data.Entity.Infrastructure.Design.Executor.OperationBase.<>c__DisplayClass4_0`1.<Execute>b__0()
   at System.Data.Entity.Infrastructure.Design.Executor.OperationBase.Execute(Action action)

我一直在阅读很多博客/帖子如何解决这个问题,但似乎没有一个有效。以下是我尝试过的一些事情:

    重新安装 EntityFramework.dll 和 EntityFrameWork.SqlServer.dll 添加一个虚拟方法来显式加载程序集。这是link 最初我使用的是 EF 6.3.0 并升级到 EF 6.4.0。我认为升级是问题,所以我降级了,但仍然遇到同样的问题。

更新 这是实体的代码:

public class EntityA: BaseEntity
    
        /// <summary>
        /// Gets or sets Contact identifier
        /// </summary>
        public int Id  get; set; 

        public string Name  get; set; 

        public string Description  get; set; 

        public bool IsActive  get; set; 

在单独的类中使用 Fluent API 配置:

public class EntityAConfiguration : EntityTypeConfiguration<EntityA>
    
        public EntityAConfiguration()
        
            this.ToTable("EntityA")
                .HasKey(c => c.Id);

            this.Property(c => c.Id)
                .HasColumnName("Id")
                .HasColumnType("int")
                .IsRequired();

            this.Property(c => c.Name)
                .HasColumnName("Name")
                .HasColumnType("Varchar(40)")
                .IsRequired();

            this.Property(c => c.Description)
                .HasColumnName("Description")
                .HasColumnType("Varchar(100)")
                .IsRequired();

            this.Property(c => c.IsActive)
                .HasColumnName("IsActive")
                .HasColumnType("bit");
        
    

BaseEntity 类只有两个属性:CreatedDate、UpdatedDate。我在所有需要存储该信息的实体中使用该类。

在这一点上,我已经没有如何解决这个问题的想法了。如果有人遇到类似的问题,如果您能提供帮助或向我指出任何可以提供帮助的信息,我将不胜感激。

【问题讨论】:

I had to do some refactoring to use a more explicit Fluent API 您能否给我们展示一个我们可以复制的示例来帮助您? @Çöđěxěŕ,帖子已更新。 试试this.Property(e =&gt; e.Name).HasColumnType("VARCHAR").HasMaxLength(40);等等……这是一种更流畅的API方法。 HasColumnType 不需要太长... 【参考方案1】:

这是我得到的错误:在 SqlServer 提供程序清单中找不到存储类型“Varchar(100)”

这是因为它是无效的,正如我在上面的评论中提到的,你不能在HasColumnType 中传递类型的长度。要解决此问题,请参见下文。

public EntityAConfiguration()
        
            this.ToTable("EntityA")
                .HasKey(c => c.Id);

            this.Property(c => c.Id)
                .HasColumnName("Id")
                .HasColumnType("INT")
                .IsRequired();

            this.Property(c => c.Name)
                .HasColumnName("Name")
                .HasColumnType("VARCHAR")
                .HasMaxLength(40)
                .IsRequired();

            this.Property(c => c.Description)
                .HasColumnName("Description")
                .HasColumnType("VARCHAR")
                .HasMaxLength(100)
                .IsRequired();

            this.Property(c => c.IsActive)
                .HasColumnName("IsActive")
                .HasColumnType("bit");
        

您现在将看到一个名为HasMaxLength 的新属性,这是您定义长度的地方。 HasColumnType 只是类型定义,仅此而已。

【讨论】:

我刚刚对我的配置类进行了更改并且它起作用了。我试图以与 EF Core 中相同的方式实现它,但在 EF 6 中似乎不支持这种方法。感谢您指出我正确的方向

以上是关于在 SqlServer 提供程序清单中找不到存储类型“Varchar(100)”的主要内容,如果未能解决你的问题,请参考以下文章

错误 175:在配置中找不到指定的存储提供程序 - Sql Server CE

在 ProviderRepository.php 第 208 行中找不到提供程序类

错误 175:在配置中找不到指定的存储提供程序,或者对 EF4 和 SQL Server CE 4 无效

使用 ssis 包在 SQL Server 代理作业中找不到存储过程错误

适用于 blob 的 Azure Java SDK - 已请求加载默认 HttpClient 提供程序,但在类路径中找不到该提供程序

在项目或库中找不到清单中引用的类