Ладислав действительно прав.
(мы надеемся, что этот пост может сэкономить время для того, кто пытается использовать IsStoreGeneratedIdentity
, IsStoreGeneratedComputed
и StoreGeneratedPattern
независимо от T4.) Мне понадобилось более 2 часов, чтобы найти проблему и сузить поиск по ключевым словам найдите этот пост)
Интересно, что даже MS не знает об этом факте, в своем последнем EF 6 в 2015 году , а класс EdmProperty
тривиально демонстрирует неработающие свойства. Также интересно, как эти простые (не работающие) свойства могут пройти модульное тестирование за последние 4 года? Возникает вопрос, сколько мест эти неработающие свойства используются внутри и зависимыми утилитами и вызывают проблемы?
Не работает IsStoreGeneratedIdentity
код из сборки MS EF6:
public bool IsStoreGeneratedIdentity
{
get
{
Facet facet;
if (this.TypeUsage.Facets.TryGetValue("StoreGeneratedPattern", false, out facet))
return (StoreGeneratedPattern) facet.Value == StoreGeneratedPattern.Identity;
return false;
}
}
Не работает IsStoreGeneratedComputed
код из сборки MS EF6:
public bool IsStoreGeneratedComputed
{
get
{
Facet facet;
if (this.TypeUsage.Facets.TryGetValue("StoreGeneratedPattern", false, out facet))
return (StoreGeneratedPattern) facet.Value == StoreGeneratedPattern.Computed;
return false;
}
}
А свойство StoreGeneratedPattern
использует этот базовый и не работающий код в сборке MS EF6:
internal static StoreGeneratedPattern GetStoreGeneratedPattern(EdmMember member)
{
Facet facet;
if (member.TypeUsage.Facets.TryGetValue("StoreGeneratedPattern", false, out facet) && facet.Value != null)
return (StoreGeneratedPattern) facet.Value;
return StoreGeneratedPattern.None;
}
Код прибывает из:
// Type: System.Data.Entity.Core.Metadata.Edm.EdmMember
// Assembly: EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
// MVID: 9A9FD4AC-352D-4B91-95F8-2AF29ABDC792
// Assembly location: C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\EntityFramework.dll
Наконец я закончил со следующими методами расширения в качестве замены не работающих оригинальных:
public static class EdmMemberExtensions
{
public static StoreGeneratedPattern StoreGeneratedPattern2(this EdmMember @this)
{
const string name = "http://schemas.microsoft.com/ado/2009/02/edm/annotation:StoreGeneratedPattern";
var metaDataProperty = @this.MetadataProperties.FirstOrDefault(m => m.Name == name);
if (metaDataProperty == null)
{
return StoreGeneratedPattern.None;
}
return (StoreGeneratedPattern) Enum.Parse(typeof (StoreGeneratedPattern), (string) metaDataProperty.Value);
}
public static bool IsStoreGeneratedIdentity2(EdmMember @this)
{
return StoreGeneratedPattern2(@this) == StoreGeneratedPattern.Identity;
}
public static bool IsStoreGeneratedComputed2(EdmMember @this)
{
return StoreGeneratedPattern2(@this) == StoreGeneratedPattern.Computed;
}
}