es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo configurar un tipo “Owned” que referencia otra entidad en EF Core 6.

Tengo la siguiente entidad llamada Slot.

public class Slot : Entity
{
    public virtual SnackPile SnackPile { get; set; }
}

Aquí, SnackPile es un objeto de valor y no tiene una tabla propia. Es propiedad de Slot. SnackPile se ve así.

public sealed class SnackPile : ValueObject
{
    public static readonly SnackPile Empty = new SnackPile(Snack.None, 0, 0m);
    public Snack Snack { get; } // Tenga en cuenta este Snack, llegaremos a esto.
    public int Quantity { get; }
    public decimal Price { get; }
    private SnackPile() { }
}

Para configurarlo, tengo lo siguiente.

modelBuilder.Entity<slot>().OwnsOne(slot => slot.SnackPile, slotToSnackpile =>
{
    slotToSnackpile.Property(ss => ss.Price).IsRequired();
    slotToSnackpile.Property(ss => ss.Quantity).IsRequired();
    //slotToSnackpile.Navigation(p => p.Snack).IsRequired(); // Esto no funciona.
}).Navigation(slot => slot.SnackPile).IsRequired();

Hasta aquí todo bien.

Ahora, SnackPile tiene una propiedad llamada Snack, y esto es una entidad. ¿Cómo se configura esto?
Como puede ver, intenté agregar esto.

slotToSnackpile.Navigation(p => p.Snack).IsRequired(); // Esto no funciona.

Esto muestra el siguiente error.

No se encontró la navegación 'SnackPile.Snack'. Agregue la navegación al tipo de entidad antes de configurarla.

También probé los siguientes dos, pero sin éxito.

//slotToSnackpile.Property(ss => ss.Snack).IsRequired();

Esto muestra el siguiente error. La propiedad 'SnackPile.Snack' es de tipo 'Snack' que no es compatible con el proveedor de base de datos actual. Cambie el tipo CLR de la propiedad o ignore la propiedad utilizando el atributo '[NotMapped]' o utilizando 'EntityTypeBuilder.Ignore' en 'OnModelCreating'.

Y con este otro

//slotToSnackpile.Property(ss => ss.Snack.Id).IsRequired();

Obtengo el error. La expresión 'ss => ss.Snack.Id' no es una expresión de acceso a miembros válida. La expresión debe representar un acceso a propiedad o campo simple: 't => t.MiPropiedad'. (Parámetro 'memberAccessExpression')

¡Atascado! ¿Alguna idea?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Parece que la entidad de Snack no está siendo reconocida por la configuración de ef-core-6.0. Una solución podría ser agregar la entidad de Snack a la configuración del modelBuilder como una entidad separada utilizando el método modelBuilder.Entity<snack>(). Luego, en la configuración de la entidad Slot, puedes usar los métodos HasKey y HasForeignKey para establecer una relación entre las entidades Slot y Snack.

    Aquí tienes un ejemplo:

    modelBuilder.Entity<snack>()
        .HasKey(s => s.Id); // asumiendo que la entidad Snack tiene una propiedad Id
    
    modelBuilder.Entity<slot>()
        .OwnsOne(slot => slot.SnackPile, slotToSnackpile =>
        {
            slotToSnackpile.Property(ss => ss.Price).IsRequired();
            slotToSnackpile.Property(ss => ss.Quantity).IsRequired();
    
            // asumiendo que la entidad Snack tiene una propiedad SnackPileId como clave foránea
            slotToSnackpile.HasForeignKey(ss => ss.Snack.SnackPileId).IsRequired();
        })
        .Navigation(slot => slot.SnackPile).IsRequired();
    

    Esto debería establecer una relación entre las entidades Snack y Slot, y la entidad SnackPile debería poder hacer referencia correctamente a la entidad Snack.

Comments are closed.