实体框架IsStoreGeneratedComputed为false,即使列映射指定HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed)

时间:2014-10-02 17:36:20

标签: entity-framework

我使用流畅的API将列映射为

 Property(_ => _.Designation)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed);

在相应的迁移中,定义了一个UDF并更改了表以将列映射到自定义UDF。

但是当我询问此字段的元数据时,我看到edmProperty.IsStoreGeneratedComputed == false。这是令人惊讶的;我认为IsStoreGeneratedComputed是真的。

无论如何,我想知道如何通过实体框架元数据检测到列/字段实际上是计算出来的。谢谢!

2 个答案:

答案 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)

发生这种情况的原因是你所看到的EdmProperty来自C空间,而不是S空间。由于它来自C空间,它代表实体属性,可以是标量或复杂属性。如果您映射它,您可以获得实际代表数据库中存储列的S空间EdmProperty IsStoreGeneratedComputed == true,就像您预期的那样。< / p>

以下是关于如何在属性和列之间进行映射的really good instructions from Rowan Miller

但是,可以从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;
}