14

我正在尝试使用 EF 核心 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.Border”属于接口类型(“IGeometry”)。如果它是导航属性,则通过将其转换为映射的实体类型手动配置此属性的关系,否则使用“OnModelCreating”中的 NotMappedAttribute 或“EntityTypeBuilder.Ignore”忽略该属性。

同样,如果我将其更改为 Geometry 类型,我会得到:

无法映射属性“Geometry.UserData”,因为它属于“对象”类型,不是受支持的原始类型或有效的实体类型。显式映射此属性,或使用“[NotMapped]”属性或使用“OnModelCreating”中的“EntityTypeBuilder.Ignore”忽略它。

我不提前知道我的对象是点还是线还是多边形,所以它必须是通用的。我如何在我的结构中表示它?另外我看到一些地方说我需要添加以下代码:

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”的定义,并且找不到接受“SqlServerDbContextOptionsBuilder”类型的第一个参数的可访问扩展方法“UseNetTopologySuite”(您是否缺少 using 指令或程序集引用?)

即使我安装了 nuget 包

4

1 回答 1

25
  1. 安装相关的 NetTopologySuite 包,它取决于你使用的数据库,例如你使用的是 SqlServer 所以你需要安装这个 NuGet 包:

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

所以它看起来像这样:

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

我不必using在文件中添加 a,因为我已经引用过,仅供参考,Microsoft.EntityFrameworkCore如果您需要它。

如果即使在安装 NuGet 包后仍出现参考错误,请转到管理 NuGet 包并检查它是否在已安装列表中,以及是否清理并重建您的解决方案并重新启动 Visual Studio,这可能会有所帮助。

于 2019-02-20T18:23:52.150 回答