2

Entity Framework 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) を使用することは可能ですか?

4

2 に答える 2

2

それは 1 つのプロパティだけですか、それとも全面的にこれが必要ですか (つまり、モデル全体で、外部キー名が常に "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 NavigationPropertyConfigurationConvention
    : IConfigurationConvention<PropertyInfo, NavigationPropertyConfiguration>
{
    public void Apply(
        PropertyInfo propertyInfo, Func<NavigationPropertyConfiguration> configuration)
    {
        var foreignKeyProperty = 
            propertyInfo.DeclaringType.GetProperty("Id" + propertyInfo.Name);

        if (foreignKeyProperty != null && configuration().Constraint == null)
        {
            var fkConstraint = new ForeignKeyConstraintConfiguration();
            fkConstraint.AddColumn(foreignKeyProperty);

            configuration().Constraint = fkConstraint;
        }           
    }
}

これについては、より詳細なブログ記事も書きました。

于 2013-03-23T22:13:57.203 に答える
2

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;
    }
}
于 2017-05-05T15:46:02.697 に答える