2016-07-17 3 views
4

Я пытаюсь создать миграцию с колонкой JSON. Вот что я пробовал:Npgsql/EF 6 - столбец 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"); 

Ничто не работает на всех, вот исключение:

System.InvalidOperationException: Последовательность не содержит соответствующий элемент в System.Linq.Enumerable.Single [TSource] (IEnumerable 1 source, Func 2 предикат) на System.Data.Entity.Utilities.DbProviderManifestExtensions.GetStoreTypeFromName (DbProviderManifest providerManifest, имя String) в System.Data.Entity.ModelConfiguration.Configuration.Properties.Primitive.PrimitivePropertyConfiguration.ConfigureColumn (колонка EdmProperty, Ent ityType стол, DbProviderManifest providerManifest) в System.Data.Entity.ModelConfiguration.Configuration.Properties.Primitive.PrimitivePropertyConfiguration.Configure (колонка EdmProperty, EntityType таблицы, DbProviderManifest providerManifest, Boolean, Boolean AllowOverride fillFromExistingConfiguration) в System.Data.Entity.ModelConfiguration .Configuration.Properties.Primitive.PrimitivePropertyConfiguration. <> c__DisplayClass4.b__3 (кортежи 2 pm) at System.Data.Entity.Utilities.IEnumerableExtensions.Each[T](IEnumerable-Т.С., Действие 1 action) at System.Data.Entity.ModelConfiguration.Configuration.Properties.Primitive.PrimitivePropertyConfiguration.Configure(IEnumerable 1 propertyMappings, DbProviderManifest providerManifest, булева AllowOverride, булева fillFromExistingConfiguration) на 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) на System.Data.Entity.ModelConfiguration.Configuration.ModelConfiguration.Configure (DbDatabaseMapping databaseMapping, DbProviderManifest providerManifest) в System.Data.Entity.DbModelBuilder.Build (DbProviderManifest providerManifest, DbProviderInfo providerInfo) в System.Data.Entity.DbModelBuilder .Build (DbConnection providerConnection) в System.Data.Entity.Internal.LazyInternalC ontext.CreateModel (LazyInternalContext internalContext) на System.Data.Entity.Internal.RetryLazy 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.Initialize() на System.Data.Entity.Internal.Linq.InternalSet 1.get_InternalContext() at System.Data.Entity.Internal.Linq.InternalSet 1.get_Local() в System.Data.Entity .DbSet`1.get_Local() на System.Data.Entity.DbModelBuilderExtensions.RegisterUserAccountChildTablesForDelete [TKey, TAccount, TUserClaim, TLinkedAccount, TLinkedAccountClaim, TPasswordResetSecret, TTwoFactorAuthToken, TUserCertificate] (DbContext CTX) в C: \ Ballen \ GitHub \ \ brockallen BrockAllen.MembershipReboot \ SRC \ BrockAllen.MembershipReboot.Ef \ DbModelBuilderExtensions.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

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

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

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