实体框架6客户关系公约(Entity Framework 6 Custom Relationship

2019-07-22 22:17发布

我已阅读本实体框架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阿尔法3)的最新版本?

Answer 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;
        }           
    }
}

我也写了一个更详细的博客张贴这一点。



Answer 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;
    }
}


文章来源: Entity Framework 6 Custom Relationship Convention