我正在编写一个应用程序,我需要查询某个位置半径内的记录.我开始在我的PCO上只有一对纬度/长的属性,但意识到SQL中的空间搜索是针对列类型的地理位置完成的,这种搜索在POCO中转换为DbGeography(在另一个SO帖子中引用,也使用EF Powertools Reverse工程师POCO).
所以,我看到的问题是我尽可能地保持我的POCOS干净,尽可能地省去所有对实体框架和持久性存储的引用/依赖.我在模型/域组件中有我的POCOS,它永远不应该引用EF.只有我的Repository类和DataStore for DbContext子类和Fluent Configuration项目才知道EF.我还使用流畅的配置远离DataAnnotation属性.一旦你放入DbGeography你需要'使用System.Data.Entity.Spatial'和'EF'打破持久性不可知的方法,至少对于"普通"的旧C#对象.
有了这么多的数据库平台,并且尽可能地使这个系统成为未来的证明,并且在我想切换到另一个持久性存储的事件中重写数据存储代码的最小努力,保持我的域代码尽可能干净是非常重要的.我觉得很奇怪,基于EF流利代码配置引入,使我们不必使用DataAnnotations属性,因此维持System.Data.Entity的出来混的,但有空间,他们打破这种模式.
有谁知道如何处理我正在尝试做的事情?
- 斯科特评论后更新:所以还有一个小问题.我有对System.Data.Entity的引用,我在我的模型上有这个: public System.Data.Spatial.DbGeography GeoLocation {get; 组; }
我在配置类中有这个: this.Property(t => t.GeoLocation).HasColumnName("GeoLocation").HasColumnType("geography");
this.Property得到下划线,我得到这个编译错误: 严重性代码描述项目文件行抑制状态错误CS0453类型'DbGeography'必须是非可空值类型才能在泛型类型中将其用作参数'T'或方法'StructuralTypeConfiguration.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都可以构建它.