拉迪斯拉夫确实是对的。
(希望这篇文章可以为那些尝试使用IsStoreGeneratedIdentity、IsStoreGeneratedComputed 和StoreGeneratedPattern 的人腾出时间,不管 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;
}
}