Using T4 to generate Poco classes, ignores the StoreGeneratedPattern attribute

I use the Poco template and DbContext T4 in vs 2010 to create pocos for data access, I modified it to fit some syntax required by the data access level.

I have one problem: the identifier column (StoreGeneratedPattern = Identity) in the edmx file does not affect the T4 generation process, here is my code for it:

var identity = edmProperty.TypeUsage.Facets.Where(f => f.Name == "StoreGeneratedPattern").FirstOrDefault(); if (identity != null && ((System.Data.Metadata.Edm.StoreGeneratedPattern)identity.Value) == System.Data.Metadata.Edm.StoreGeneratedPattern.Identity) isIdentity = true; 

it will always be false , is there any reason for this?

+4
source share
2 answers

StoreGeneratedPattern not saved in gran, but in MetadataProperties try something like this:

 var identity = edmProperty.MetadataProperties .Where(m => m.Name == "http://schemas.microsoft.com/ado/2009/02/edm/annotation:StoreGeneratedPattern") .FirstOrDefault(); bool isIdentity = identity != null && identity.Value == System.Data.Metadata.Edm.StoreGeneratedPattern.Identity.ToString(); 
+4
source

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; } } 
0
source

Source: https://habr.com/ru/post/1384558/


All Articles