我已阅读本实体框架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)的最新版本?
难道仅仅是一个属性,或者你需要这个一刀切(即整个模型是使用约定,其中外键的名称总是“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;
}
}
}
我也写了一个更详细的博客张贴这一点。
在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;
}
}