實體框架6自定義關係約定

c# entity-framework entity-framework-6

我已閱讀有關實體框架6中的約定的文檔。但它不包含關係的約定。

假設我有以下型號:

[TablePrefix("mst")]
public class Guru
{
    public int Id { get; set; }

    public int? IdKotaLahir { get; set; }

    public virtual Kota KotaLahir { get; set; }
}

我想將物業IdKotaLahir作為導航物業KotaLahir外鍵。外鍵名稱為"Id"+<NavigationPropertyName> 。是否可以使用當前版本的實體框架(EF 6 alpha 3)?

一般承認的答案

它只是一個屬性還是你需要全面的(即整個模型使用的是外鍵名稱總是“Id”+ NavigationPropertyName)的約定?如果您只想要單個實體的外鍵,那麼最好只使用ForeignKey屬性:

public class Guru
{
    public int Id { get; set; }

    public int? IdKotaLahir { get; set; }

    [ForeignKey("IdKotaLahir")]
    public virtual Kota KotaLahir { get; set; }
}

這適用於EF5和EF6。在EF6中,您可以使用自定義約定來配置外鍵屬性。這是我提出的自定義約定:

public class Guru
{
    public int Id { get; set; }

    public int? IdKotaLahir { get; set; }

    [ForeignKey("IdKotaLahir")]
    public virtual Kota KotaLahir { get; set; }
}

我還寫了一篇更詳細的博客文章


熱門答案

在EF6中,接受的答案的約定不再有效,因為IConfigurationConvention是內部的。處理此類場景的方法是繼承ForeignKeyDiscoveryConvention。

public class MyForeignKeyDiscoveryConvention : ForeignKeyDiscoveryConvention
{
    protected override bool MatchDependentKeyProperty(AssociationType associationType, AssociationEndMember dependentAssociationEnd,
        EdmProperty dependentProperty, EntityType principalEntityType, EdmProperty principalKeyProperty)
    {
        string navigationPropertyName = ((System.Reflection.PropertyInfo)dependentAssociationEnd.MetadataProperties.GetValue("ClrPropertyInfo", false).Value).Name;

        // The standard foreign key property to look for is NavigationProperty_PrimaryKeyName (e.g. "TableName_Id"). 
        // Use the below line to remove that underscore.
        //return dependentProperty.Name == navigationPropertyName + principalKeyProperty.Name;

        // Use the following for the IdKotaLahir scenario
        return dependentProperty.Name == "Id" + navigationPropertyName;
    }
}



許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因