我使用流畅的API将列映射为
Property(_ => _.Designation)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed);
在相应的迁移中,定义了一个UDF并更改了表以将列映射到自定义UDF。
但是当我询问此字段的元数据时,我看到edmProperty.IsStoreGeneratedComputed == false
。这是令人惊讶的;我认为IsStoreGeneratedComputed
是真的。
无论如何,我想知道如何通过实体框架元数据检测到列/字段实际上是计算出来的。谢谢!
答案 0 :(得分:1)
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";
}
答案 1 :(得分:0)
发生这种情况的原因是你所看到的 以下是关于如何在属性和列之间进行映射的really good instructions from Rowan Miller。 但是,可以从C空间标量EdmProperty
来自C空间,而不是S空间。由于它来自C空间,它代表实体属性,可以是标量或复杂属性。如果您映射它,您可以获得实际代表数据库中存储列的S空间EdmProperty
和 IsStoreGeneratedComputed == true
的,就像您预期的那样。< / p>
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;
}