使用T4生成Poco类,忽略StoreGeneratedPattern属性

时间:2011-12-04 10:33:52

标签: entity-framework entity-framework-4.1 poco t4 edmx

我正在使用Poco& vs 2010中的DbContext T4模板为我的数据访问生成pocos,我修改了它以匹配我的数据访问层所需的一些语法。

我有一个问题,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,这有什么理由吗?

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:0)

Ladislav确实是对的。

(对于那些试图使用IsStoreGeneratedIdentityIsStoreGeneratedComputedStoreGeneratedPattern而不管T4的人来说,希望这篇文章可以腾出时间。)我花了2个多小时来找到问题和缩小的谷歌搜索关键字找到这篇文章)

有趣的是,甚至MS都不知道这个事实,在2015年最新的EF 6中EdmProperty类暴露了一些不工作的属性。同样有趣的是,这些简单(不工作)的属性在过去4年中如何通过单元测试?问题出现了,这些不起作用的地方有多少地方被利用并依赖于公用设施并导致问题?

不使用MS EF6程序集中的IsStoreGeneratedIdentity代码:

public bool IsStoreGeneratedIdentity
{
  get
  {
    Facet facet;
    if (this.TypeUsage.Facets.TryGetValue("StoreGeneratedPattern", false, out facet))
      return (StoreGeneratedPattern) facet.Value == StoreGeneratedPattern.Identity;
    return false;
  }
}

不使用MS EF6程序集中的IsStoreGeneratedComputed代码:

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