Тип хранилища 'Varchar (100)' не найден в манифесте поставщика SqlServer. - PullRequest
1 голос
/ 23 марта 2020

Я работаю над проектом MVC 4, который использует EF 6 для всех операций с базой данных и с нее (сервер SQL). Мне пришлось провести некоторый рефакторинг, чтобы использовать более явный Fluent API. По сути, теперь у каждого объекта в проекте есть соответствующий код Fluent API для всех отображений.

Проблема возникает, когда я пытаюсь запустить команды EF из консоли диспетчера пакетов. Это ошибка, которую я получаю: Не удалось найти тип хранилища 'Varchar (100)' в манифесте поставщика SqlServer

Это полный журнал ошибки:

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)

Я читал много блогов / постов, как решить эту проблему, но ни один из них, похоже, не работает. Вот несколько вещей, которые я попробовал:

  1. Переустановка EntityFramework.dll и EntityFrameWork.SqlServer.dll
  2. Добавление фиктивного метода для явной загрузки сборки. Это ссылка
  3. Изначально я использовал 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. Я использую этот класс во всех сущностях, которым необходимо хранить эту информацию.

На данный момент у меня заканчиваются идеи, как решить эту проблему. Если кто-то сталкивается с подобной проблемой, я был бы очень признателен, если бы вы могли помочь или указать мне любую информацию, которая может помочь.

1 Ответ

3 голосов
/ 23 марта 2020

Это ошибка, которую я получаю: тип хранилища 'Varchar (100)' не найден в манифесте поставщика SqlServer

Это связано с тем, что он недействителен, как упоминалось в Мой комментарий выше, вы не можете передать длину типа в 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 - это только определение типа, ничего более.

...