【问题标题】:Using T4 to generate Poco classes, ignores the StoreGeneratedPattern attribute使用 T4 生成 Poco 类,忽略 StoreGeneratedPattern 属性
【发布时间】:2011-12-04 10:33:51
【问题描述】:

我在 vs 2010 中使用 Poco & 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,有什么原因吗?

【问题讨论】:

  • 伙计们,这是一个已知问题吗?还是我使用的语法错误?

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


【解决方案1】:

StoreGeneratedPattern 不存储在构面中,但在 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();

【讨论】:

  • 谢谢。有趣的是,即使 MS 在 2015 年的最新 EF 6 中也不知道这个事实
【解决方案2】:

拉迪斯拉夫确实是对的。

(希望这篇文章可以为那些尝试使用IsStoreGeneratedIdentityIsStoreGeneratedComputedStoreGeneratedPattern 的人腾出时间,不管 T4 是什么。)我确实花了 2 个多小时来定位问题并使用缩小的谷歌搜索关键字找到这篇文章)

有趣的是,即使 MS 在 2015 年的最新 EF 6 中也不知道这一事实,并且EdmProperty 类暴露了微不足道的不工作属性。有趣的是,这些简单(不起作用)的属性如何在过去 4 年中通过单元测试?问题出现了,这些不工作的属性在内部和依赖实用程序中有多少地方被使用并导致问题?

来自 MS EF6 程序集的 IsStoreGeneratedIdentitycode 不起作用:

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 程序集的 IsStoreGeneratedComputedcode 不起作用:

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

【讨论】:

    猜你喜欢
    • 2013-09-18
    • 2022-08-03
    • 2011-10-16
    • 2011-05-31
    • 1970-01-01
    • 2011-05-26
    • 2023-04-04
    • 1970-01-01
    • 2011-07-13
    相关资源
    最近更新 更多