关于Abp vnext Mysql 空间数据存储 NetTopologySuite记录


最近在项目中突然要用到空间存储、电子围栏,Mysql貌似要5.7以上才支持Geometry相关的存储。

顺便贴上ef core 空间数据的文档地址:https://docs.microsoft.com/zh-cn/ef/core/modeling/spatial
  1. 项目结构:

  abp版本:4.3.3

  Mysql版本: 8.0.18

mysql> select version();
+-----------+
| version() |
+-----------+
| 8.0.18 |
+-----------+
1 row in set (0.03 sec)

abp的高版本和低版本大同小异!!!

  我记得现在版本的abp venxt之后DbContext,高版本只需要配置一个就行了,低版本 *.EntityFrameworkCore 和 *.EntityFrameworkCore.DbMigrations  配置。

1.添加项目引用

 项目文件添加 ,这里可以Version主要看你当前EFCore版本

但是这样是不行的哈。 包括官网的文档也是这样

  var builder = new DbContextOptionsBuilder()
                .UseMySql(configuration.GetConnectionString("Default") 
                    , optionsBuilder => optionsBuilder.UseNetTopologySuite());

数据库迁移的时候会莫名其妙的报一堆错。

正确构造builder

要重写 UseNetTopologySuite 方法 

扩展方法

    public static class MySqlNetTopologySuiteDbContextOptionsBuilderExtensions
    {
        public static Microsoft.EntityFrameworkCore.Infrastructure.MySqlDbContextOptionsBuilder UseNetTopologySuite(
            this Microsoft.EntityFrameworkCore.Infrastructure.MySqlDbContextOptionsBuilder optionsBuilder)
        {
            DbContextOptionsBuilder optionsBuilder1 =
                ((IRelationalDbContextOptionsBuilderInfrastructure)optionsBuilder).OptionsBuilder;
            ((IDbContextOptionsBuilderInfrastructure)optionsBuilder1)
                .AddOrUpdateExtension(CreateMySqlNetTopologySuiteOptionsExtension(optionsBuilder1));
            return optionsBuilder;
        }

        private static MySqlNetTopologySuiteOptionsExtension CreateMySqlNetTopologySuiteOptionsExtension(
            DbContextOptionsBuilder optionsBuilder)
        {
            return optionsBuilder.Options.FindExtension() ??
                   new MySqlNetTopologySuiteOptionsExtension();
        }
    }

*.EntityFrameworkCore 下的 EntityFrameworkCoreModule

        public override void ConfigureServices(ServiceConfigurationContext context)
        {
            context.Services.AddAbpDbContext(options =>
            {
                /* Remove "includeAllEntities: true" to create
                 * default repositories only for aggregate roots */
                options.AddDefaultRepositories(includeAllEntities: true);
            });

            Configure(options =>
            {
                /* The main point to change your DBMS.
                 * See also CustomerManagerMigrationsDbContextFactory for EF Core tooling. */
                options.UseMySQL(x => x.UseNetTopologySuite());
            });

        }

*.EntityFrameworkCore.DbMigrations 下的 MigrationsDbContextFactory

        public CustomerManagerMigrationsDbContext CreateDbContext(string[] args)
        {
            CustomerManagerEfCoreEntityExtensionMappings.Configure();

            var configuration = BuildConfiguration();

            var builder = new DbContextOptionsBuilder()
                .UseMySql(configuration.GetConnectionString("Default")
                    , MySqlServerVersion.LatestSupportedServerVersion
                    , optionsBuilder => optionsBuilder.UseNetTopologySuite());

            return new CustomerManagerMigrationsDbContext(builder.Options);
        }

差不多就这样,电子围栏 大家懂就是了 图就这意思:

 如果有其他更好的写法,欢迎大家讨论!!!