gpt4 book ai didi

entity-framework - EF Core 内存中阵列映射

转载 作者:行者123 更新时间:2023-12-04 01:08:04 25 4
gpt4 key购买 nike

我在数据库中有一个字符串数组列

ALTER TABLE sample ADD languages VARCHAR[] NULL;

映射到模型:
public string[] languages { get; set; }

使用 EF Core 和 PostgreSQL (Npgsql.EntityFrameworkCore.PostgreSQL 2.2.0) 开箱即用。

但是,当我想使用 In-Memory (Microsoft.EntityFrameworkCore.InMemory 2.2.4) 测试 DbContext 时,出现此错误:

System.InvalidOperationException:无法映射属性“sample.languages”,因为它的类型“string[]”不是受支持的原始类型或有效的实体类型。显式映射此属性,或使用 '[NotMapped]' 属性或使用 'OnModelCreating' 中的 'EntityTypeBuilder.Ignore' 忽略它。

因此,将其添加到模型构建器配置中可以解决 In-Memory 错误:
 builder.Property(p => p.languages)
.HasConversion(
v => string.Join("'", v),
v => v.Split(',', StringSplitOptions.RemoveEmptyEntries));

但引发了新的(Npgsql):

Can't cast database type character varying[] to String at Npgsql.NpgsqlDefaultDataReader.GetFieldValue[T](Int32 column)



请问您有什么提示吗?

最佳答案

没有多少数据库支持开箱即用的数组类型列。实际上 PostgreSQL 可能是目前支持的数据库中唯一一个这样做的。根据原始异常,显然内存数据库也不支持它(当前)。

EF Core 为每种数据库类型构建一个单独的模型。每个数据库提供者公开一个扩展方法 DatabaseFacade喜欢 IsSqlServer() , IsNpgsql() , IsInMemory()等里面可以使用OnModelCreating如果需要,有条件地为特定数据库类型配置不同的映射。

预期用途是这样的:

modelBuilder.Entity<Sample>(builder =>
{
if (!Database.IsNpgsql()) // <--
{
builder.Property(p => p.languages)
.HasConversion(
v => string.Join("'", v),
v => v.Split(',', StringSplitOptions.RemoveEmptyEntries));
}
});

如果您使用单独的类实现 IEntityTypeConfiguration<TEntity>为了配置模型,那么你应该通过 Database到它们的构造函数并存储在一个类成员中,因为 EntityTypeBuilder<TEntity>传递给 Configure方法不提供此类信息。

关于entity-framework - EF Core 内存中阵列映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56312401/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com