Использовать опцию сильных пространственных типов в конструкторе моделей заблокирован?
Я работаю над моделью первой модели EF6 в подходе модель первый.
EF предоставляет больше, чем DBGeometry и DBGeography, и позволяет мне выбирать конкретные подтипы при проектировании модели (например, GeographyPoint).
Однако мои сгенерированные классы все еще просто DBGeography, даже когда я выбираю более конкретный подтип.
Я заметил свойство в модели, которое называется "Использовать строгие пространственные типы", но по умолчанию оно имеет значение false и кажется заблокированным (выделено серым цветом, раскрывающийся список отсутствует, ввод невозможен). Кажется, это подразумевает поддержку генерации классов с более строгой типизацией (например, вместо сгенерированного DBGeography в сгенерированном классе будет использоваться GeographyPoint)
Есть идеи, что может быть причиной этого? Это звучит как полезная функция.
Я нацеливаюсь на SQL Server Express 2012, если это проблема, я могу переключиться на другую версию, так как я не делаю никаких конкретных версий.
ОБНОВЛЕНИЕ: смотрите ссылку на изображение, если вы не уверены, что понимаете, о чем я говорю!
https://www.dropbox.com/s/lzgsoi60whuicy0/EF%20Spacial%20Strong.png?dl=0
3 ответа
Написано в отношении реализации Entity Framework v6.1.1.
Если вы ищете для своего свойства определенные классы, такие как GeographyPoint, а не DBGeography, то в реализации Entity Framework такого нет.
Все связанные с географией вещи для Entity Framework сосредоточены в одном классе System.Data.Entity.Spatial.DBGeography. Экземпляр такого класса может действовать по-разному в зависимости от фактических данных.
Например, если вы работаете с точкой, вы можете получить доступ к свойствам высоты, долготы и широты. Если это на самом деле коллекция, вы можете получить доступ к свойству ElementCount.
И в ваших запросах вы можете использовать методы DbGeography (например, Distance ()) для выполнения запросов, специфичных для типа, таких как:
var myLocation = DbGeography.FromText("POINT(40.7127, 74.0059)");
var results = from p in Points
orderby p.Distance(myLocation)
select p;
На самом деле я не вижу свойства "Использовать строгие пространственные типы", работающего под управлением VS 2013.3, EF Power Tools Beta 4.
ОБНОВИТЬ
Нашел это под фактическими свойствами модели данных. Что ж, это скорее вопрос для разработчиков 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; }
Как видите, все версии EF выше 2 должны возвращаться FeatureState.VisibleAndEnabled
, Текущая реализация EntityFrameworkVersion.Version3
, но все же пункт меню отключен, и все равно его значение равно false. Мы видим false в конструкторе из-за аннотации, указанной в концептуальной модели в вашем edmx-файле, которая явно устанавливает его в false:
<!-- CSDL content -->
<edmx:ConceptualModels>
<Schema xmlns:annotation="http://schemas.microsoft.com/ado/2009/02/edm/annotation"
annotation:UseStrongSpatialTypes="false">
</Schema>
</edmx:ConceptualModels>
Это установлено в false на этапе генерации в EdmXmlSchemaWriter
if (_version == XmlConstants.EdmVersionForV3)
{
_xmlWriter.WriteAttributeString(
AnnotationNamespacePrefix,
XmlConstants.UseStrongSpatialTypes,
XmlConstants.AnnotationNamespace,
XmlConstants.False);
}
Но если версия EF равна 3, а FeatureState - VisibleAndEnabled, почему пункт меню отключен? Это приводит нас к следующему свойству:
IsReadOnlyUseStrongSpatialTypes
со следующей реализацией (верно всегда):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)); }
Как видите, он всегда возвращает истину и от TODO
комментарий мы можем догадаться, что в настоящее время это не поддерживается. К сожалению, для старых версий EntityDesign
проект, поэтому трудно отследить, почему именно это было изменено.
Как упоминал Павел в этом комментарии, команда EF хотела принять некоторую существующую пространственную библиотеку (без необходимости ее реализации и поддержки), но вариантов не было, поэтому они реализовали более простые классы DbGeography и DbGeometry, пока не станут доступны другие опции.
Вероятно, с тех пор IsReadOnlyUseStrongSpatialTypes
свойство было изменено, чтобы всегда возвращать истину, так что Use Strong Spatial Types
пункт меню выделен серым цветом в конструкторе, и было добавлено примечание с описанием используемых типов DbGeography и DbGeometry.
РЕЗЮМЕ
Просто подведу итог моему ответу - он отключен, потому что он не применим для Entity Framework v5.0 и более поздних версий (и соответствующих версий Visual Studio) - реализация изменилась.
Причина, по которой параметр "Использовать строгие пространственные типы" недоступен в конструкторе EF, заключается в том, что false
это единственная опция, разрешенная средой исполнения EF. Теперь, очевидно, вопрос в том, почему это единственное значение, поддерживаемое средой выполнения. Вы можете найти ответ в коде - если вы посмотрите на класс TypeUsageBuilder, вы найдете следующий комментарий в строке 200:
// Forward compat FUTURE SYSTEM.SPATIAL
// for now we treat all Geographic types the same, and likewise for geometry.
// to allow us to later introduce the full heirarchy without breaking back compat
// we require spatial types to have the IsStrict facet with a false value.
// Set this facet to false if the schema has the UseStrongSpatialTypes attribute with the a false.
Из того, что я помню как член команды EF в то время, мы (как команда EF) не хотели заниматься созданием и обслуживанием нашей собственной пространственной библиотеки, поскольку это не то, на что должна ориентироваться команда ORM. В то время не было никакой пространственной библиотеки, которую мы могли бы принять, поэтому мы решили пойти с чем-то простым, что сработало бы (читайте DbGeometry
а также DbGeography
типов). Я думаю, что надежда была на то, что мы сможем использовать эту пространственную библиотеку, которая была начата в то время, но этого не произошло. Также обратите внимание, что система типов EDM (используемая в CSDL) содержит понятие пространственных подтипов (ln. 183), но когда их необходимо преобразовать в тип Clr, DbGeometry
или же DbGeography
тип будет возвращен (см.: PrimitiveType ln. 181)
Вам необходимо загрузить и установить Microsoft® System CLR Types для Microsoft® SQL Server® 2012 с пакетом обновления 1 (SP1) с сайта пакетов дополнительных компонентов Microsoft SQL Server 2012 (или без пакета обновления 1 (SP1): MS SQL Server 2012 Feature Pack).
Необходимые условия для пространственных типов с Microsoft SQL Server
Пространственная поддержка SQL Server зависит от низкоуровневых специфичных для SQL Server типов SqlGeography и SqlGeometry. Эти типы находятся в сборке Microsoft.SqlServer. Types.dll, и эта сборка не поставляется как часть EF или как часть.NET Framework.
Когда Visual Studio установлена, она часто также устанавливает версию SQL Server, и это включает установку Microsoft.SqlServer. Types.dll.
Если SQL Server не установлен на компьютере, на котором вы хотите использовать пространственные типы, или если пространственные типы были исключены из установки SQL Server, вам потребуется установить их вручную. Типы включены в пакеты дополнительных компонентов SQL Server, и для SQL Server 2008 и SQL Server 2012 существуют различные сборки:
Имя файла: Имя файла: пакет X86 и x64 (SQLSysClrTypes.msi)
Пакет типов CLR системы SQL Server содержит компоненты, реализующие типы идентификаторов геометрии, географии и иерархии в SQL Server 2012. Этот компонент можно установить отдельно от сервера, чтобы клиентские приложения могли использовать эти типы вне сервера.