Pregunta

Conseguir un error al intentar establecer una ForeignKeyAttribute en una clase base

class User { }

abstract class FruitBase
{    
   [ForeignKey("CreateById")]
   public User CreateBy{ get; set; }

   public int CreateById{ get; set; }     
}

class Banana : FruitBase { }

class DataContext : DbContext
{    
   public DbSet<Banana> Bananas { get; set; }
}

Si muevo el código FruitBase en el plátano, todo está bien, pero yo no quiero, ya que habrá muchos muchos frutos y quiero seguir siendo relativamente seco si puedo

¿Es este tema know una que será fijado por el mes de marzo? ¿Alguien sabe un trabajo alrededor?

¿Fue útil?

Solución

El problema causado por el hecho de que en su DbContext se pone en lugar de DbSet<Banana> DbSet<FruitBase>. El siguiente modelo de objetos funciona como se espera:

public class User 
{
    public int UserId { get; set; }
}

public abstract class FruitBase
{
    public int Id { get; set; }
    public int CreateById { get; set; }

    [ForeignKey("CreateById")]
    public User CreateBy { get; set; }
}

public class Banana : FruitBase { }

public class DataContext : DbContext
{        
    public DbSet<FruitBase> Fruits { get; set; }                
}

Hay que tener en cuenta que al hacer esto, se está creando esencialmente un Asociación polimórfica y como de CTP5, no todas las estrategias de mapeo herencia permitir la asociación polimórfica. Aquí funciona bien porque ha usado tabla por jerarquía (TPH) .

Actualización: Use tabla por tipo (TPT) Estrategia:

polimórficos Asociaciones de trabajo con TPT así:

public class StackoverflowTestContext : DbContext
{
    public DbSet<FruitBase> Fruits { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Banana>().ToTable("Bananas");
    }         
}

Otros consejos

como se discutió anteriormente, esto es TPC ( tabla por tipo de hormigón ), la respuesta / trabajo por aquí es tomar el ForeignKeyAttribute fuera de la base

class User{}

abstract class AuditObjectBase{ // was FruitBase

   // [ForeignKey("CreateById")]
   public abstract User CreateBy{ get; set; } // made abstract

   public int CreateById{ get; set; } // both get and set required public

}

class ItemOne : AuditObjectBase{ // Was Banana

   // added
   [ForeignKey("CreateById")]
   public override User CreateBy{ get; set; }
}

class ItemTwo : AuditObjectBase{ // Added

   [ForeignKey("CreateById")]
   public override User CreateBy{ get; set; }
}

class DataContext : DbContext{

   DbSet<ItemOne> ItemOnes{ get; set; }
   DbSet<ItemTwo> ItemTwos{ get; set; }
}

No completamente seco, pero al menos cuando se crea un objeto que utiliza el AuditObjectBase que le obligará a aplicar la propiedad de clave externa, algunos comentarios agradables para recordarle el atributo y ya está

Básicamente las costuras, los atributos deben ser agregado a la clase declarada en la DbContext como una entidad, en este caso tiene una propiedad DbSet.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top