Entity framework 实体Framwork IsStoreGeneratedComputed false,即使列映射指定HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed)
我已经使用fluentapi映射了一个列Entity framework 实体Framwork IsStoreGeneratedComputed false,即使列映射指定HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed),entity-framework,Entity Framework,我已经使用fluentapi映射了一个列 Property(_ => _.Designation) .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed); 在相应的迁移中,定义了一个UDF,并修改了表以将列映射到自定义UDF 但当我查询此字段的元数据时,我看到edmProperty.IsStoreGeneratedComputed==false。这是令人惊讶的;我想,是存储生成的计算机应该是正确的 无论如何,我想知道
Property(_ => _.Designation)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed);
在相应的迁移中,定义了一个UDF,并修改了表以将列映射到自定义UDF
但当我查询此字段的元数据时,我看到edmProperty.IsStoreGeneratedComputed==false
。这是令人惊讶的;我想,是存储生成的计算机
应该是正确的
无论如何,我想知道如何通过实体框架元数据检测列/字段实际上是计算出来的。谢谢 发生这种情况的原因是您正在查看的
EdmProperty
来自C空间,而不是S空间。因为它来自C空间,所以它表示实体属性,可以是标量属性,也可以是复杂属性。如果映射它,您可以得到S-spaceEdmProperty
,它实际上表示数据库中的存储列,并且正如您所期望的那样,IsStoreGeneratedComputed==true
public static bool IsComputed(this EdmProperty edmProperty) {
//Note the attribute may be set to Computed even though edmProperty.IsStoreGeneratedComputed == false
var storeGeneratedPatternAttribute = edmProperty.MetadataProperties.SingleOrDefault(_ => _.Name == "http://schemas.microsoft.com/ado/2009/02/edm/annotation:StoreGeneratedPattern");
return storeGeneratedPatternAttribute != null && storeGeneratedPatternAttribute.Value.ToString() == "Computed";
}
下面介绍如何在属性和列之间映射
但是,可以从C空间标量EdmProperties
中提取信息,而无需映射,尽管它的鲁棒性较差:
// Alternative, allows you to compare `== Identity`, `== Computed`, `!= None`, etc:
public static StoreGeneratedPattern GetSSpaceScalarColumnStoreGeneratedPattern(this EdmProperty property)
{
MetadataProperty item;
return property.MetadataProperties.TryGetValue("http://schemas.microsoft.com/ado/2009/02/edm/annotation:StoreGeneratedPattern", false, out item)
? (StoreGeneratedPattern)Enum.Parse(typeof(StoreGeneratedPattern), item.Value.ToString())
: System.Data.Entity.Core.Metadata.Edm.StoreGeneratedPattern.None;
}