实体框架核心-EF核心2.2-'Point.Boundary'是接口类型('IGeometry')

时间:2018-12-09 02:09:55

标签: entity-framework-core-2.1 asp.net-core-2.2

我正在尝试EF Core 2.2的新功能。它基于以下文章。 “宣布实体框架核心2.2” https://blogs.msdn.microsoft.com/dotnet/2018/12/04/announcing-entity-framework-core-2-2/

我安装了以下Nuget软件包。

enter image description here

我在模型中添加了以下内容。

using NetTopologySuite.Geometries;


//New as of EF.Core 2.2 
//[Required] 
//[NotMapped] 
public Point Location { get; set; }

enter image description here

在应用程序启动期间,在以下行中的数据库上下文中出现以下错误:      Database.EnsureCreated();

enter image description here

System.InvalidOperationException   HResult = 0x80131509   Message =属性“ Point.Boundary”是接口类型(“ IGeometry”)。如果它是导航属性,则通过将其强制转换为映射的实体类型来手动配置此属性的关系,否则使用“ OnModelCreating”中的NotMappedAttribute或“ EntityTypeBuilder.Ignore”忽略该属性。   Source = Microsoft.EntityFrameworkCore

2 个答案:

答案 0 :(得分:8)

您需要致电UseNetTopologySuite()。此处的示例:

public class ApplicationDbContext : IdentityDbContext
{
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
        : base(options)
    {

    }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        IConfigurationRoot configuration = new ConfigurationBuilder()
           .SetBasePath(Directory.GetCurrentDirectory())
           .AddJsonFile("appsettings.json")
           .Build();
        var connectionString = configuration.GetConnectionString("DefaultConnection");
        optionsBuilder.UseSqlServer(connectionString, opts => opts.UseNetTopologySuite());
    }
    public DbSet<Test> Tests { get; set; }
}


public class Test
{
    public int Id { get; set; }
    public Point Location { get; set; }
}

我遇到了这个问题,因为我有一个 if (!optionsBuilder.IsConfigured)中的OnConfiguring周围的所有内容。为了使add-migrations能够正常工作,我不得不将其删除。

答案 1 :(得分:1)

正如Kyle指出的那样,您需要调用UseNetTopologySuite(),但我会在ConfigureServices中这样调用它:

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services
            .AddEntityFrameworkNpgsql()
            .AddDbContext<MyDBContext>(opt =>
                opt.UseNpgsql(Configuration.GetConnectionString("MyDBConnection"),
                                o=>o.UseNetTopologySuite()))
            .BuildServiceProvider();
        ...
    }
    ...
}