Entity framework 使用T4生成Poco类时,将忽略StoreGeneratedPattern属性

Entity framework 使用T4生成Poco类时,将忽略StoreGeneratedPattern属性,entity-framework,entity-framework-4.1,poco,t4,edmx,Entity Framework,Entity Framework 4.1,Poco,T4,Edmx,我在VS2010中使用Poco&DbContext T4模板为我的数据访问生成Poco,我对其进行了修改,以匹配我的数据访问层所需的一些语法 我有一个问题,edmx文件中的标识列(StoreGeneratedPattern=identity)不会影响T4生成过程,下面是我的代码: var identity = edmProperty.TypeUsage.Facets.Where(f => f.Name == "StoreGeneratedPattern").FirstOrDefault()

我在VS2010中使用Poco&DbContext T4模板为我的数据访问生成Poco,我对其进行了修改,以匹配我的数据访问层所需的一些语法

我有一个问题,edmx文件中的标识列(StoreGeneratedPattern=identity)不会影响T4生成过程,下面是我的代码:

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;

这总是
false
,有什么原因吗?

StoreGeneratedPattern
不存储在facets中,而是存储在
MetadataProperties
中,请尝试以下操作:

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();

拉迪斯拉夫确实是对的

(希望这篇文章能为那些试图使用
IsStoreGeneratedIdentity
IsStoreGeneratedComputed
StoreGeneratedPattern
而不考虑T4的人腾出时间。)我花了2个多小时找到问题,并用谷歌关键词缩小搜索范围找到这篇文章)

有趣的是,即使是MS也不知道这一事实,在2015年最新的EF 6中,
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;
  }
}
public bool IsStoreGeneratedComputed
{
  get
  {
    Facet facet;
    if (this.TypeUsage.Facets.TryGetValue("StoreGeneratedPattern", false, out facet))
      return (StoreGeneratedPattern) facet.Value == StoreGeneratedPattern.Computed;
    return false;
  }
}
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;
}
不工作
IsStoreGeneratedComputed
来自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;
  }
}
public bool IsStoreGeneratedComputed
{
  get
  {
    Facet facet;
    if (this.TypeUsage.Facets.TryGetValue("StoreGeneratedPattern", false, out facet))
      return (StoreGeneratedPattern) facet.Value == StoreGeneratedPattern.Computed;
    return false;
  }
}
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;
}
StoreGeneratedPattern
属性在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;
  }
}
public bool IsStoreGeneratedComputed
{
  get
  {
    Facet facet;
    if (this.TypeUsage.Facets.TryGetValue("StoreGeneratedPattern", false, out facet))
      return (StoreGeneratedPattern) facet.Value == StoreGeneratedPattern.Computed;
    return false;
  }
}
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;
    }
}

伙计们,这是一个已知的问题吗?还是我用的语法错了?谢谢。有趣的是,在2015年最新的EF 6中,即使是微软也不知道这一事实