Question

J'ai une petite question au sujet de la mise en place des correspondances entre [Order Details], [Products] et [Orders] dans le datbase Northwind.

[Order Details] n'a pas de clé primaire, et se présente comme suit

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

Alors, ma question est de savoir comment puis-je (et je peux) mettre en place ma classe OrderDetails au travail comme celui-ci?

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; }
}

Mon regard du contexte de données comme celle-ci

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);
    }

}

Mon OrderDetailsConfiguration (vide parce que je ne sais pas ce que je fais)

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

Les conseils ou les idées seraient grandes.

Était-ce utile?

La solution

D'abord, vous aurait explicitement mis dans les clés primaires et à l'intérieur FKs OrderDetails class:

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; }
}

Ensuite, avec le code suivant, vous pouvez spécifier les clés primaires pour OrderDetailsConfiguration Classe:
(S'il vous plaît noter que dans Northwind base de données à la fois OrderID et ProductID sont PKs pour OrderDetails Tableau).

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

Et vous pouvez également utiliser RecreateDatabaseIfModelChanges stratégie pour forcer votre base de données à recréer chaque fois que vous changez le modèle de classe:

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

Le point intéressant est que, une fois que vous avez fait ces changements EF déduire automatiquement les FKs de OrderDetails classe et créer les relations à Commandes et Produits tableau sur OrderID et ProductID sur la base

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top