Столбец 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] (IEnumerable
1 source, Func
2 предикат) в системе.Данные.Сущность.Коммунальные услуги.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](IEnumerable
1 ТС, действие1 action) at System.Data.Entity.ModelConfiguration.Configuration.Properties.Primitive.PrimitivePropertyConfiguration.Configure(IEnumerable
1 propertyMappings, providerManifest DbProviderManifest, логическое директива allowoverride, логическое fillFromExistingConfiguration) в системе.Данные.Сущность.Конфигурация модели.Конфигурация.Типы.StructuralTypeConfiguration.ConfigurePropertyMappings (IList1 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) около Система.Данные.Сущность.Конфигурация модели.Конфигурация.Конфигурация модели.Настройка (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.InternalSet
1.Инициализировать() в системе.Данные.Сущность.Внутренний.Линк.InternalSet1.get_InternalContext() at System.Data.Entity.Internal.Linq.InternalSet
1.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 ответ:
Таким образом, это вполне выполнимо, но требует изменения сгенерированной миграции, а не аннотирования модели или использования fluent configuration. В созданной миграции измените объявление столбца
data
, чтобы использовать аргументыstoreType
иdefaultValueSql
:data = c.String(nullable: false, storeType: "jsonb", defaultValueSql: "'{}'::jsonb")
Я могу подтвердить, что это работает для Npgsql 3.1.7 с EntityFramework6.Npgsql 3.1.1, и сохранит и загрузит применимые сущности без проблем. Не могу поручиться за более ранние версии.