Ron*_*dau 7 sql-server entity-framework .net-4.5 ef-model-first entity-framework-6
我正在以模型第一种方法开发模型第一个EF6模型.
EF暴露的不仅仅是DBGeometry和DBGeography,还允许我在设计模型时选择特定的子类型(如GeographyPoint).
但是,即使我选择了更具体的子类型,我生成的类仍然只是DBGeography.
我注意到模型上的一个名为"使用强空间类型"的属性,但默认设置为false并且似乎已锁定(灰色,没有下拉列表,无法键入).这似乎意味着支持生成更强大的类型化的类(例如,在生成的类中将使用GeographyPoint而不是DBGeography)
知道是什么原因引起的吗?这听起来像一个有用的功能.
我的目标是SQL Server Express 2012,如果这是一个问题,我可以切换到另一个版本,因为我没有做任何特定的版本.
更新:如果你不确定你理解我所指的是什么,请参见图片链接!
https://www.dropbox.com/s/lzgsoi60whuicy0/EF%20Spacial%20Strong.png?dl=0

关于Entity Framework v6.1.1实现的编写.
如果您正在为您的属性寻找GeographyPoint等特定类而不是DBGeography,那么实体框架实现中就没有这样的类.
Entity Framework的所有与地理相关的东西都集中在一个System.Data.Entity.Spatial.DBGeography类中.此类的实例可以根据实际数据采取不同的行动.
例如,如果使用Point,则可以访问" 高程"," 经度"和" 纬度"属性.如果它实际上是一个集合,您可以访问ElementCount属性.
在您的查询中,您可以使用DbGeography方法(即Distance())来执行特定于类型的查询,例如:
var myLocation = DbGeography.FromText("POINT(40.7127, 74.0059)");
var results = from p in Points
orderby p.Distance(myLocation)
select p;
Run Code Online (Sandbox Code Playgroud)
实际上,我没有看到运行VS 2013.3,EF Power Tools Beta 4的"使用强空间类型"属性.
UPDATE
在实际数据模型属性下找到它.嗯,这对EF的开发人员来说更是一个问题,但是如果你看一下EFEntityModelDescriptor的源代码(描述所有这些扩展菜单项的组件),有两个属性负责Use Strong Spatial Types菜单项:
UseStrongSpatialTypes默认返回true或调用GetUseStrongSpatialTypesFeatureState:
internal static FeatureState GetUseStrongSpatialTypesFeatureState(Version schemaVersion)
{
Debug.Assert(EntityFrameworkVersion.IsValidVersion(schemaVersion), "Invalid schema version.");
return schemaVersion > EntityFrameworkVersion.Version2
? FeatureState.VisibleAndEnabled
: FeatureState.VisibleButDisabled;
}
Run Code Online (Sandbox Code Playgroud)如您所见,所有超过2的EF版本都应该返回FeatureState.VisibleAndEnabled.当前实现是EntityFrameworkVersion.Version3,但仍然禁用菜单项,其值仍为false.我们在设计器中看到false,因为edmx文件中的Conceptual Model中指定的注释明确地将其设置为false:
<!-- CSDL content -->
<edmx:ConceptualModels>
<Schema xmlns:annotation="http://schemas.microsoft.com/ado/2009/02/edm/annotation"
annotation:UseStrongSpatialTypes="false">
</Schema>
</edmx:ConceptualModels>
Run Code Online (Sandbox Code Playgroud)
这在EdmXmlSchemaWriter的生成阶段设置为false
if (_version == XmlConstants.EdmVersionForV3)
{
_xmlWriter.WriteAttributeString(
AnnotationNamespacePrefix,
XmlConstants.UseStrongSpatialTypes,
XmlConstants.AnnotationNamespace,
XmlConstants.False);
}
Run Code Online (Sandbox Code Playgroud)
但是,如果EF版本为3且FeatureState为VisibleAndEnabled,为什么菜单项被禁用?这导致我们进入下一个属性:
IsReadOnlyUseStrongSpatialTypes 具有以下实现(始终为true):
internal bool IsReadOnlyUseStrongSpatialTypes()
{
// TODO: when runtime support for the other (true) setting of this attribute is available replace the "return true" below by the commented line below it
return true;
// return (!EdmFeatureManager.GetUseStrongSpatialTypesFeatureState(TypedEFElement.Artifact.SchemaVersion));
}
Run Code Online (Sandbox Code Playgroud)正如你所看到的,它总是返回true,从TODO评论中我们可以猜到目前没有对它的支持.遗憾的是,旧版本的EntityDesign项目没有可用的源代码,因此很难跟踪为何更改了这些代码.
正如Pawel在本评论中所提到的,EF团队希望采用一些现有的空间库(无需实现和维护),但没有选项,因此他们实现了更简单的DbGeography和DbGeometry类,直到其他选项可用.
可能,从那以后,IsReadOnlyUseStrongSpatialTypes属性被更改为始终返回true,因此Use Strong Spatial Types菜单项在设计器中显示为灰色,并添加了有关使用的DbGeography和DbGeometry类型的描述注释.
摘要
只是总结一下我的答案 - 它被禁用,因为它不适用于Entity Framework v5.0及以后版本(以及Visual Studio的相应版本) - 实现已经改变.