Использование T4 для генерации классов Poco игнорирует атрибут StoreGeneratedPattern - PullRequest
4 голосов
/ 04 декабря 2011

Я использую шаблон Poco & DbContext T4 в версии 2010 для генерации pocos для моего доступа к данным, я изменил его, чтобы он соответствовал некоторому синтаксису, требуемому моим уровнем доступа к данным.

У меня есть одна проблема: столбец идентификаторов (StoreGeneratedPattern = Identity) в файле edmx не влияет на процесс генерации 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 ]

4 голосов
/ 04 декабря 2011

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();
0 голосов
/ 25 мая 2015

Ладислав действительно прав.

(мы надеемся, что этот пост может сэкономить время для того, кто пытается использовать IsStoreGeneratedIdentity, IsStoreGeneratedComputed и StoreGeneratedPattern независимо от T4.) Мне понадобилось более 2 часов, чтобы найти проблему и сузить поиск по ключевым словам найдите этот пост)

Интересно, что даже MS не знает об этом факте, в своем последнем EF 6 в 2015 году , а класс 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;
  }
}

Не работает IsStoreGeneratedComputed код из сборки MS EF6:

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