C#POCO的DbGeography替代方案
本文关键字:方案 DbGeography C#POCO | 更新日期: 2023-09-27 18:26:19
我正在编写一个应用程序,需要查询某个位置半径内的记录。我一开始在我的PCO上只使用了一对lat/long属性,但我意识到SQL中的空间搜索是针对一种列类型的地理进行的,该列类型在POCO中可以翻译为DbGeography(在另一篇SO文章中引用,也使用EF Powertools反向工程POCO)。
所以,我看到的问题是,我尽可能地保持POCOS的干净,尽可能地省略对实体框架和持久性存储的所有引用/依赖。我在一个模型/域程序集中有我的POCOS,它不应该有任何对EF的引用。只有我的Repository类和DbContext子类的DataStore以及Fluent Configuration项目知道EF。我还使用fluent配置远离DataAnnotation属性。一旦你放入DbGeography,你就需要"使用System.Data.Entity.SSpatial"answers"EF",这打破了持久性不可知的方法,至少对于"Plain"Old C#对象来说是这样。
有这么多数据库平台,为了让这个系统尽可能经得起未来的考验,在我想切换到另一个持久性存储的情况下,用最少的精力重写数据存储代码,保持我的域代码尽可能干净是非常重要的。我觉得奇怪的是,引入了基于EF fluent代码的配置,并允许我们不必使用DataAnnotations属性,因此将System.Data.Entity排除在外,但在空间方面,它们打破了这种模式。
有人知道如何处理我想要做的事情吗?
--Scott评论后更新:因此,仍然存在一个小问题。我有对System.Data.Entity的引用,我的模型上有这样的引用:公共System.Data.Spatial.DbGeography地理位置{get;set;}
我的配置类中有以下内容:this.Property(t=>t.GeoLocation).HasColumnName("GeoLocation").HasColumnType("geographic")
这个。属性带有下划线,我得到以下编译错误:严重性代码描述项目文件行禁止显示状态错误CS0453类型"DbGeography"必须是不可为null的值类型,才能将其用作泛型类型或方法"StructureTypeConfiguration.Property(Expression>)"FoodRadar.DataStore C:''Developer''SrcSt''FoodRadar''FoodRadar.DataStore''Configuration''VendorConfiguration.cs 66 Active
我尝试了另一个反向poco生成器,它使用t4模板,并使用System.Data.Entity.Spatial.DbGeography生成,但这仍然需要引用EntityFramework。
我应该如何指定映射?
从.NET 4.5开始,他们意识到需要将DbGeography
作为核心.NET Framework的一部分,并将其从EntityFramework.dll中移出,放入System.Data.Entity.dll中,这是他们现在提供的ORM Agnostic API,以便EF和任何其他ORM可以在此基础上构建。