Entity framework 使用T4生成Poco类时,将忽略StoreGeneratedPattern属性
我在VS2010中使用Poco&DbContext T4模板为我的数据访问生成Poco,我对其进行了修改,以匹配我的数据访问层所需的一些语法 我有一个问题,edmx文件中的标识列(StoreGeneratedPattern=identity)不会影响T4生成过程,下面是我的代码: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()
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中,即使是微软也不知道这一事实