2010-11-11 12 views
3

J'ai une petite question sur la configuration des mappages entre [Order Details], [Products] et [Orders] dans la base de données Northwind.Comment spécifier une clé composée dans Entity Framework Code Première

[Order Details] n'a pas de clé primaire, et ressemble à ce

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

Alors ma question est de savoir comment puis-je (et je peux) mettre en place ma OrderDetails classe pour travailler comme ça?

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 contexte de données ressemble à ce

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

} 

Et 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 des idées seraient génial.

Répondre

4

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

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

Puis, avec le code suivant, vous pouvez spécifier les clés primaires pour OrderDetailsConfiguration Classe:
(S'il vous plaît notez que dans Northwind base de données à la fois OrderID et ProductID sont PK 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éée 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 classer et créer les relations à Commandes et Produits produits sur OrderID et Produc tid basé sur le Conventions for Code First:

premier code déduira que toute propriété nommée <navigation property name><primary key property name> (à savoir ProductsProductID), <principal class name><primary key property name> (c'est-à-dire ProductProductID) ou <primary key property name> (c'est-à-dire ProductID), avec le même type de données que la clé primaire, représente une clé étrangère pour la relation. Si plusieurs correspondances sont trouvées, la priorité est donnée dans l'ordre indiqué ci-dessus. La détection de clé étrangère ne sera pas sensible à la casse.

+0

Merci pour votre aide, Morteza. Je suppose que la prochaine question est de savoir comment garder la commande et l'identifiant du produit protégés, mais je vais creuser un peu avant de demander ici. – Joe

+0

Pas de problème, je suis content que ça a aidé :) –

Questions connexes