标签:vnext Abp DbContextOptionsBuilder UseNetTopologySuite 空间数据 EntityFrameworkCore o
最近在项目中突然要用到空间存储、电子围栏,Mysql貌似要5.7以上才支持Geometry相关的存储。
顺便贴上ef core 空间数据的文档地址:https://docs.microsoft.com/zh-cn/ef/core/modeling/spatial
- 项目结构:
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版本
<PackageReference Include="Pomelo.EntityFrameworkCore.MySql.NetTopologySuite" Version="5.0.0 />
或者nuget
Install-Package Pomelo.EntityFrameworkCore.MySql.NetTopologySuite -Version 5.0.0
2.之后网上大多数都会直接,这样使用,但是这样是不行的哈。 包括官网的文档也是这样
var builder = new DbContextOptionsBuilder<CustomerManagerMigrationsDbContext>() .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<MySqlNetTopologySuiteOptionsExtension>() ?? new MySqlNetTopologySuiteOptionsExtension(); } }
*.EntityFrameworkCore 下的 EntityFrameworkCoreModule
public override void ConfigureServices(ServiceConfigurationContext context) { context.Services.AddAbpDbContext<CustomerManagerDbContext>(options => { /* Remove "includeAllEntities: true" to create * default repositories only for aggregate roots */ options.AddDefaultRepositories(includeAllEntities: true); }); Configure<AbpDbContextOptions>(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<CustomerManagerMigrationsDbContext>() .UseMySql(configuration.GetConnectionString("Default") , MySqlServerVersion.LatestSupportedServerVersion , optionsBuilder => optionsBuilder.UseNetTopologySuite()); return new CustomerManagerMigrationsDbContext(builder.Options); }
差不多就这样,电子围栏 大家懂就是了 图就这意思:
如果有其他更好的写法,欢迎大家讨论!!!
标签:vnext,Abp,DbContextOptionsBuilder,UseNetTopologySuite,空间数据,EntityFrameworkCore,o 来源: https://www.cnblogs.com/NorthMeditation/p/15966879.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。