Entity Framework 6 Custom Relationship Convention

c# entity-framework entity-framework-6

Pregunta

He leído esta documentación sobre la convención en Entity Framework 6. Pero no contiene la convención para la relación.

Supongamos que tengo el siguiente modelo:

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

    public int? IdKotaLahir { get; set; }

    public virtual Kota KotaLahir { get; set; }
}

Quiero que la propiedad IdKotaLahir sea ​​una clave externa de la propiedad de navegación KotaLahir . El nombre de la clave foránea es "Id"+<NavigationPropertyName> . ¿Es posible usar la versión actual de framework de entidades (EF 6 alpha 3)?

Respuesta aceptada

¿Es solo una propiedad o necesita esto en todos los ámbitos (es decir, todo el modelo está utilizando una convención donde los nombres de las claves foráneas son siempre "Id" + NavigationPropertyName)? Si solo desea la clave externa para una sola entidad, será mejor que use el atributo ForeignKey :

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

    public int? IdKotaLahir { get; set; }

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

Esto funcionará tanto para EF5 como para EF6. En EF6 puede usar convenciones personalizadas para configurar propiedades de clave externa. Aquí está la convención personalizada que se me ocurrió:

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

    public int? IdKotaLahir { get; set; }

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

También escribí una entrada de blog más detallada sobre esto.


Respuesta popular

En EF6, la convención de la respuesta aceptada ya no funciona porque IConfigurationConvention es interna. La forma de manejar este tipo de escenario es heredando de 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;
    }
}



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué