EF Core 2.2空间类型不能添加到数据库迁移

人气:281 发布:2022-10-16 标签: c# entity-framework spatial ef-core-2.2

问题描述

我正在尝试使用EF core 2.2构建一个具有空间对象的数据库,但在尝试创建数据库迁移时遇到了问题。使用https://docs.microsoft.com/en-us/ef/core/modeling/spatial,特别是:

class Country
{
    public int CountryID { get; set; }

    public string CountryName { get; set; }

    // Database includes both Polygon and MultiPolygon values
    public IGeometry Border { get; set; }
}

如果我尝试使用此命令创建迁移,则会收到以下错误:

属性‘Country.Borde’属于接口类型(‘IGeometry’)。 如果它是导航属性,则手动配置 通过将此属性强制转换为映射的实体类型,否则忽略 使用NotMappdAttribute的属性或 "OnModelCreating"中的"EntityTypeBuilder.Ignore"。

同样,如果我将其更改为几何图形类型,则会得到:

无法映射属性‘Geometry.UserData’,因为它是 不是受支持的基元类型或不是有效的 实体类型。显式映射此属性,或使用 "[NotMaps]"属性,或使用中的"EntityTypeBuilder.Ignore" "OnModelCreating"。

我不知道我的对象是点、直线还是多边形,所以它必须是泛型的。我如何在我的结构中表现这一点?此外,我还看到一些地方说我需要添加以下代码:

public class MyDBContextFactory : IDesignTimeDbContextFactory<MyDBContext>
    {

        public MyDBContext CreateDbContext(string[] args)
        {
            var builder = new DbContextOptionsBuilder<MyDBContext>();
            builder.UseSqlServer(cnnString, x => x.UseNetTopologySuite());
            return new MyDBContext(builder.Options);
        }
   }

但我收到错误:

‘SqlServerDbContextOptionsBuilder’不包含 "UseNetTopologySuite",没有可访问的扩展方法 "UseNetTopologySuite"接受类型为 找不到"SqlServerDbContextOptionsBuilder"(是否缺少 使用指令还是程序集引用?)

即使我安装了Nuget包

推荐答案

在您正在使用的数据库上安装相关的NetTopologySuite包depends,例如您使用的是SQLServer,因此需要安装此NuGet包:

Microsoft.EntityFrameworkCore.SqlServer.NetTopologySuite 2)配置您的数据库使用NetTopologySuite(需要编辑的代码通常在StartUp.ConfigureServices()中)。只需在options.UseSqlServer括号内添加, x => x.UseNetTopologySuite()

如下所示:

services.AddDbContext<ManagerContext>(options =>
    options.UseSqlServer(
        Configuration.GetConnectionString("DefaultConnection"),
        x => x.UseNetTopologySuite()
    )
);

我不必向文件添加using,因为我已经引用了,仅供参考,如果您需要,它将是Microsoft.EntityFrameworkCore

如果您在安装NuGet程序包后仍收到引用错误,请转到管理NuGet程序包并检查它是否在已安装列表中,如果它在已安装列表中,则重新生成您的解决方案并重新启动Visual Studio。这可能会有所帮助。

431