在模型设计器中使用强空间类型选项锁定?

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

在此输入图像描述

t3z*_*t3z 6

关于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菜单项:

  1. 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,为什么菜单项被禁用?这导致我们进入下一个属性:

  1. 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的相应版本) - 实现已经改变.