PostGis + EF + NetTopologySuite 将派生类型写入 db 时出现异常

问题描述 投票:0回答:1

我正在开发一个使用 EF 连接到 Postgres/PostGis 数据库的 NET 8 应用程序。我有一个具有几何形状的实体?数据类型(它是多边形和点的基础),我将在其中存储任一派生类型。我们有一个事件驱动域,所以我实际上编写了一个投影来将现有事件保存到数据库中,并且所有这些都工作正常。我可以毫无问题地存储多边形和点。

我现在正在为应用程序级逻辑编写测试。我正在使用 Testcontainers.Postgres 运行安装了 postgis 和 hstore 扩展的 postgis/postgis:latest 图像。使用与投影相同的 DbContext 进行测试。但是,当我的测试尝试创建新记录时,在将更改保存到数据库时出现异常。在几何图形中存储多边形类型的情况下?属性,例外是

System.InvalidCastException : Writing values of 'NetTopologySuite.Geometries.Polygon' is not supported for parameters having NpgsqlDbType 'Geometry'.

当我尝试存储具有空几何图形的新记录时?值,我仍然遇到这个异常:

System.InvalidCastException : Writing is not supported for parameters having NpgsqlDbType 'Geometry'.

所以我知道数据库设置正确并且 DbContext/EF 配置正确,因为投影没有问题。我正在使用的 Testcontainer Postgres 实例中最大的未知数。但这运行的图像与我运行投影的图像相同。我现在不知道该检查什么。有什么想法吗?

.net postgresql testing postgis nettopologysuite
1个回答
0
投票

NpqSql 7 中连接/类型注册的工作方式显然发生了变化。因此,如果您运行 7 或 8,则可能会发生这种情况。建议使用他们的新 NpgsqlDataSourceBuilder。这解决了我的问题:

 var dataSourceBuilder = new NpgsqlDataSourceBuilder(database.GetConnectionString());
 dataSourceBuilder.UseNetTopologySuite();
 var dataSource = dataSourceBuilder.Build();

 services.AddDbContext<ApplicationDbContext>(options =>
 {
     options.UseNpgsql(dataSource, o =>
     {
         o.MigrationsAssembly(typeof(ApplicationDbContext).Assembly.FullName);
         o.MigrationsHistoryTable(schemaService.MigrationsTableName, schemaService.Name);
         o.UseNetTopologySuite();
     });
 });
© www.soinside.com 2019 - 2024. All rights reserved.