Comment spécifier une clé dans le code composé Entity Framework Première
-
08-10-2019 - |
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.
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
Autres conseils
Marquer des champs clés avec [Key] attribut. Vous devrez ajouter [colonne (ordre = x)] en cas de clés composées, x = 0, 1, 2, ... Numérotation peut commencer à partir de tout nombre https://msdn.microsoft.com/en-us/data/jj591583.aspx