Pregunta

Tengo una pregunta rápida sobre la configuración de las asignaciones entre [Order Details], [Products] y [Orders] en el datbase Neptuno.

[Order Details] no tiene clave primaria, y es similar al siguiente

[Order Details]
OrderId (int)
ProductId (int)
...

Así que mi pregunta es ¿cómo puedo (y puedo) configurar mi clase OrderDetails de trabajo como este?

public class OrderDetails
{
    public virtual Order Order { get; set; }
    public virtual Product Product { get; set; }
    public Decimal UnitPrice { get; set; }
    public int Quantity { get; set; }
    public Decimal Discount { get; set; }
}

Mis datos de contexto es similar al siguiente

public class NorthwindDb : DbContext
{
    public DbSet<Product> Products { get; set; }
    public DbSet<Category> Categories { get; set; }
    public DbSet<Order> Orders { get; set; }
    public DbSet<OrderDetails> OrderDetails { get; set; }
    public DbSet<Customer> Customers { get; set; }


    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Configurations.Add(new OrderDetailsConfiguration());
    }

    public static void InitializeBecauseOfThatWeirdMetaDataThingThatIDontUnderstandYet()
    {
        Database.SetInitializer<NorthwindDb>(null);
    }

}

Y Mi OrderDetailsConfiguration (vacío, porque no sé lo que estoy haciendo)

public class OrderDetailsConfiguration : EntityConfiguration<OrderDetails>
{
    public OrderDetailsConfiguration()
    {
        //HasKey(x => x.Order.OrderId);
        //HasKey(x => x.Product.ProductId);
    }
}

¿Alguna pista o idea sería grande.

¿Fue útil?

Solución

Lo primero que tendría que poner de forma explícita en los PK y FKs dentro de OrderDetails clase:

public class OrderDetails 
{        
    public int OrderID { get; set; }
    public int ProductID { get; set; }

    public virtual Order Order { get; set; }
    public virtual Product Product { get; set; }

    public Decimal UnitPrice { get; set; }
    public int Quantity { get; set; }
    public Decimal Discount { get; set; }
}

A continuación, con el siguiente código se puede especificar la PK para OrderDetailsConfiguration de clase:
(Tenga en cuenta que en el Neptuno base de datos tanto IDPedido y ProductID son PK para OrderDetails tabla).

public class OrderDetailsConfiguration : EntityConfiguration<OrderDetails> 
{
    public OrderDetailsConfiguration() 
    {
        HasKey(od => new 
        {
            od.ProductID,
            od.OrderID
        });
    }
}

Y también se puede utilizar RecreateDatabaseIfModelChanges estrategia para obligar a su base de datos se vuelva a crear cada vez que cambie el modelo de clases:

Database.SetInitializer<NorthwindDb>(
        new RecreateDatabaseIfModelChanges<NorthwindDb>());

El punto interesante es que una vez que se realizan estos cambios EF inferirá automáticamente los FKs de OrderDetails clase y crear las relaciones a Órdenes y Productos tabla de la IdPedido y ProductID basado en el Convenios para Código primero:

En primer Código inferirá que cualquier propiedad <navigation property name><primary key property name> llamada (es decir ProductsProductID), <principal class name><primary key property name> (es decir ProductProductID) o <primary key property name> (es decir ProductID), con el mismo tipo de datos como la clave principal, representa una clave externa para la relación. Si se encuentran varias coincidencias continuación se da prioridad en el orden indicado anteriormente. detección de clave externa no será entre mayúsculas y minúsculas.

Otros consejos

campos clave Marcar con el atributo [Clave]. Usted tendrá que añadir [Columna (Orden = x)] en el caso de claves compuestas, x = 0, 1, 2, ... La numeración puede empezar desde cualquier número https://msdn.microsoft.com/en-us/data/jj591583.aspx

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