C# POCO 的 DbGeography 替代方案

DbGeography Alternative for C# POCO

我正在编写一个应用程序,我需要在其中查询某个位置半径范围内的记录。我从我的 PCO 上只有一对纬度/经度属性开始,但意识到 SQL 中的空间搜索是针对地理列类型完成的,该列类型向下转换为 POCO 中的 DbGeography(在另一个 SO [=58 中引用) =] 并且还使用 EF Powertools 逆向工程 POCO)。

所以,我看到的问题是我尽可能保持我的 POCOS 干净,尽可能遗漏对 entity framework 和持久性存储的所有引用/依赖项。我的 POCOS 在一个 model/Domain 程序集中,它不应该有任何对 EF 的引用。只有我的 Repository classes 和 DataStore for DbContext subclass 和 Fluent Configuration 项目知道 EF。我也远离使用流畅配置的 DataAnnotation 属性。只要你放置 DbGeography,你就需要 'using System.Data.Entity.Spatial' 和 'EF',这打破了持久性不可知的方法,至少对于 "Plain" Old C# Object.

有这么多的数据库平台,为了让这个系统尽可能地面向未来,并且在我想切换到另一个持久性存储的情况下重写数据存储代码的工作量最小,将我的域代码保持为非常重要尽可能干净。我觉得奇怪的是,引入了基于 EF 流畅代码的配置并允许我们不必使用 DataAnnotations 属性,因此将 System.Data.Entity 排除在外,但对于空间来说,它们打破了模式。

有人知道如何处理我正在尝试做的事情吗?

--斯科特评论后更新: 所以还有一个小问题。 我参考了 System.Data.Entity 并且我的模型上有这个: public System.Data.Spatial.DbGeography 地理定位 { get;放; }

我的配置中有这个 class: this.Property(t => t.GeoLocation).HasColumnName("GeoLocation").HasColumnType("geography");

this.Property 有下划线,我得到这个编译错误: 严重性代码说明项目文件行抑制状态 错误 CS0453 类型 'DbGeography' 必须是不可为 null 的值类型才能将其用作泛型类型或方法 'StructuralTypeConfiguration.Property(Expression>)' FoodRadar.DataStore 中的参数 'T' C:\Developer\SrcSt\FoodRadar\FoodRadar.DataStore\Configuration\VendorConfiguration.cs 66 活动

我尝试了另一个使用 t4 模板的反向 poco 生成器,它使用 System.Data.Entity.Spatial.DbGeography 生成,但这仍然需要引用 EntityFramework。

我应该如何指定映射?

从 .NET 4.5 开始,他们意识到需要 DbGeography 作为核心 .NET Framework 的一部分并移动它 out of EntityFramework.dll and into System.Data.Entity.dll,这是他们现在的 ORM Agnostic API提供以便 EF 和任何其他 ORM 可以针对它构建。