在 SqlServer 提供程序清单中找不到存储类型 'Varchar(100)'
The store type 'Varchar(100)' could not be found in the SqlServer provider manifest
我正在开发一个 MVC 4 项目,该项目使用 EF 6 进行进出数据库(SQL 服务器)的所有操作。我必须进行一些重构才能使用更明确的 Fluent API。基本上,现在项目中的每个实体都有其对应的所有映射的 Fluent API 代码。
当我尝试从程序包管理器控制台 运行 EF 命令时出现问题。这是我得到的错误:
在 SqlServer 提供程序清单中找不到存储类型 'Varchar(100)'
这是错误的完整日志:
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)
我阅读了很多博客/post 如何解决这个问题,但其中 none 似乎可行。这些是我尝试过的一些东西:
- 正在重新安装 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; }
}
在单独的 class:
中使用 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 class 只有两个属性:CreatedDate、UpdatedDate。我在所有需要存储该信息的实体中使用 class。
此时我运行不知道如何解决这个问题。如果有人遇到类似的问题,如果您能提供帮助或向我指出任何可能有帮助的信息,我将不胜感激。
This is the error I am getting: The store type 'Varchar(100)' could not be found in the SqlServer provider manifest
这是因为它是无效的,正如我上面的评论所说,你不能传递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
只是类型定义,仅此而已。
当然,这是个人喜好问题,但我更喜欢使用属性的选项。在这种情况下,所有代码都在一个地方。
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
public class EntityA: BaseEntity
{
/// <summary>
/// Gets or sets Contact identifier
/// </summary>
public int Id { get; set; }
[Column(TypeName = "VARCHAR")]
[StringLength(40)]
public string Name { get; set; }
[Column(TypeName = "VARCHAR")]
[StringLength(100)]
public string Description { get; set; }
public bool IsActive { get; set; }
}
我正在开发一个 MVC 4 项目,该项目使用 EF 6 进行进出数据库(SQL 服务器)的所有操作。我必须进行一些重构才能使用更明确的 Fluent API。基本上,现在项目中的每个实体都有其对应的所有映射的 Fluent API 代码。
当我尝试从程序包管理器控制台 运行 EF 命令时出现问题。这是我得到的错误: 在 SqlServer 提供程序清单中找不到存储类型 'Varchar(100)'
这是错误的完整日志:
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)
我阅读了很多博客/post 如何解决这个问题,但其中 none 似乎可行。这些是我尝试过的一些东西:
- 正在重新安装 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; }
}
在单独的 class:
中使用 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 class 只有两个属性:CreatedDate、UpdatedDate。我在所有需要存储该信息的实体中使用 class。
此时我运行不知道如何解决这个问题。如果有人遇到类似的问题,如果您能提供帮助或向我指出任何可能有帮助的信息,我将不胜感激。
This is the error I am getting: The store type 'Varchar(100)' could not be found in the SqlServer provider manifest
这是因为它是无效的,正如我上面的评论所说,你不能传递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
只是类型定义,仅此而已。
当然,这是个人喜好问题,但我更喜欢使用属性的选项。在这种情况下,所有代码都在一个地方。
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
public class EntityA: BaseEntity
{
/// <summary>
/// Gets or sets Contact identifier
/// </summary>
public int Id { get; set; }
[Column(TypeName = "VARCHAR")]
[StringLength(40)]
public string Name { get; set; }
[Column(TypeName = "VARCHAR")]
[StringLength(100)]
public string Description { get; set; }
public bool IsActive { get; set; }
}