Ladislav is really right.
(This post, I hope, can save time for those trying to use IsStoreGeneratedIdentity
, IsStoreGeneratedComputed
and StoreGeneratedPattern
, regardless of T4.) It cost me more than 2 hours to find the problem, and with narrowed Google keywords find this post)
Interestingly, even MS is unaware of this fact, in its last class EF 6 in 2015 and EdmProperty
provides trivially broken properties. It is also interesting how these simple (non-working) properties pass unit test over the past 4 years? The question arises, how many places are these non-working properties used internally and dependent utilities and cause problems?
IsStoreGeneratedIdentity
code from MS EF6 assembly does not work:
public bool IsStoreGeneratedIdentity { get { Facet facet; if (this.TypeUsage.Facets.TryGetValue("StoreGeneratedPattern", false, out facet)) return (StoreGeneratedPattern) facet.Value == StoreGeneratedPattern.Identity; return false; } }
IsStoreGeneratedComputed
code from MS EF6 assembly does not work:
public bool IsStoreGeneratedComputed { get { Facet facet; if (this.TypeUsage.Facets.TryGetValue("StoreGeneratedPattern", false, out facet)) return (StoreGeneratedPattern) facet.Value == StoreGeneratedPattern.Computed; return false; } }
And the StoreGeneratedPattern
property uses this basic and non-working code in the MS EF6 assembly:
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; }
The code comes from:
// 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
Finally, I ended up using the following extension methods as a replacement for broken source ones:
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; } }