我有一个带有一些空间数据的实体...我正在程序集中使用DbGeography和DbGeometry引用System.Data.Entity...
我没有使用中引用的那个,EntityFramework.dll因为我有一个分层解决方案,并且我不想在解决方案中的任何地方引用实体框架,但只是在 DAL 内部......
当我尝试添加新的迁移时,出现以下错误:
EntityType“DbGeometry”没有定义键。定义此 EntityType 的键。
DbGeometry所以我尝试用字符串替换该属性OnModelCreating,我尝试编写以下代码:
modelBuilder.Entity<AddressInfo>()
.Property(s => s.GeometryLocation)
.HasColumnType("geometry");
Run Code Online (Sandbox Code Playgroud)
但在这种情况下,我收到字符串数据类型与数据类型不兼容的错误DbGeometry...
有谁有解决这个问题的想法吗?DbGeometry有谁知道哪种数据类型与数据类型兼容?
谢谢
更新
EntityType 'DbGeography' has no key Defined不能解决我的问题。最后,该帖子的作者说
[他]确实必须在[他的]模型中添加对实体框架的引用
这正是我想要避免的......
瑞安还说
我认为它可以通过一个聪明的数据配置图来修复,我会使用它,并且如果我遇到任何可行的技术,我会更新
知道如何修复它吗?哪种数据类型可以替代 DbGeometry?
我正在编写一个应用程序,我需要查询某个位置半径内的记录.我开始在我的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参考静止.
我该如何指定映射?