Столбец Npgsql / EF 6-json


Я пытаюсь создать миграцию с помощью столбца JSON. Вот что я попробовал:

    [Column(TypeName = "Jsonb")]
    public string Data { get; set; }

    [Column(TypeName = "Json")]
    public string Data { get; set; }

    modelBuilder.Entity<Member>().Property(p => p.Data).HasColumnType("Json");

    modelBuilder.Entity<Member>().Property(p => p.Data).HasColumnType("Jsonb");

Вообще ничего не работает, вот исключение:

Система.InvalidOperationException: последовательность не содержит соответствующего элемента в системе.Линк.Перечислимый.Single [TSource] (IEnumerable1 source, Func2 предикат) в системе.Данные.Сущность.Коммунальные услуги.DbProviderManifestExtensions.GetStoreTypeFromName (DbProviderManifest providerManifest, имя строки) около Система.Данные.Сущность.Конфигурация модели.Конфигурация.Свойства.Примитивный.PrimitivePropertyConfiguration.ConfigureColumn (столбец EdmProperty, таблица EntityType, DbProviderManifest providerManifest) в системе.Данные.Сущность.Конфигурация модели.Конфигурация.Свойства.Примитивный.PrimitivePropertyConfiguration.Настройки(колонка EdmProperty, таблица атрибутом entitytype, providerManifest DbProviderManifest, логическое директива allowoverride, логическое fillFromExistingConfiguration) около Система.Данные.Сущность.Конфигурация модели.Конфигурация.Свойства.Примитивный.PrimitivePropertyConfiguration. c _ _ DisplayClass4.Б__3(Кортеж2 pm) at System.Data.Entity.Utilities.IEnumerableExtensions.Each[T](IEnumerable1 ТС, действие1 action) at System.Data.Entity.ModelConfiguration.Configuration.Properties.Primitive.PrimitivePropertyConfiguration.Configure(IEnumerable1 propertyMappings, providerManifest DbProviderManifest, логическое директива allowoverride, логическое fillFromExistingConfiguration) в системе.Данные.Сущность.Конфигурация модели.Конфигурация.Типы.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, ICollection1 entitySets, DbProviderManifest providerManifest) около Система.Данные.Сущность.Конфигурация модели.Конфигурация.Конфигурация модели.Настройка (DbDatabaseMapping databaseMapping, DbProviderManifest providerManifest) в системе.Данные.Сущность.DbModelBuilder.Сборка (DbProviderManifest providerManifest, DbProviderInfo providerInfo) в системе.Данные.Сущность.DbModelBuilder.Build (DbConnection providerConnection) в системе.Данные.Сущность.Внутренний.LazyInternalContext.CreateModel (LazyInternalContext internalContext) около Система.Данные.Сущность.Внутренний.Ретрилазы 2.GetValue(TInput input) at System.Data.Entity.Internal.LazyInternalContext.InitializeContext() at System.Data.Entity.Internal.InternalContext.GetEntitySetAndBaseTypeForType(Type entityType) at System.Data.Entity.Internal.Linq.InternalSet1.Инициализировать() в системе.Данные.Сущность.Внутренний.Линк.InternalSet 1.get_InternalContext() at System.Data.Entity.Internal.Linq.InternalSet1.get_Local() в системе.Данные.Сущность.DbSet`1.get_Local() в системе.Данные.Сущность.DbModelBuilderExtensions.RegisterUserAccountChildTablesFordelete[TKey,TAccount,TUserClaim,TLinkedAccount,TLinkedAccountClaim,TPasswordResetSecret,TTwoFactorAuthToken,TUserCertificate](DbContext ctx) в c:ballengithubbrockallenBrockAllen.MembershipRebootsrcBrockAllen.Членство в организации.EfDbModelBuilderExtensions.cs: строка 26

Вот мой конфиг:

<package id="EntityFramework" version="6.1.1" targetFramework="net452" />
<package id="EntityFramework6.Npgsql" version="3.1.1" targetFramework="net452" />
<package id="Npgsql" version="3.1.6" targetFramework="net452" />
1 4

1 ответ:

Таким образом, это вполне выполнимо, но требует изменения сгенерированной миграции, а не аннотирования модели или использования fluent configuration. В созданной миграции измените объявление столбца data, чтобы использовать аргументы storeType и defaultValueSql:

data = c.String(nullable: false, storeType: "jsonb", defaultValueSql: "'{}'::jsonb")

Я могу подтвердить, что это работает для Npgsql 3.1.7 с EntityFramework6.Npgsql 3.1.1, и сохранит и загрузит применимые сущности без проблем. Не могу поручиться за более ранние версии.