2016-04-07 9 views
1

Obligatorisch "Erste Frage, tut mir leid, wenn ich etwas versaut habe". Ich hoffe nur, dass jemand helfen kann.Entity Framework - Fremdschlüssel Annotation ignoriert das falsche Objekt

Entity-Framework 6, .net 4.5.

Ich habe ein Produkt. Ein Produkt wird möglicherweise aus einer bestimmten Anzahl anderer Produkte hergestellt. Daher habe ich eine ProductUsed-Klasse mit zwei Produkt-IDs erstellt, eine namens ParentProductID und eine PreProductID mit einer Anmerkung zu einem virtuellen Produkt für den Fremdschlüssel, der auf die "PreProductID" verweist. . Jedes Mal, wenn ich darauf zugreife, wird das Produkt für die ParentProductID geladen.

public class Product 
{ 
    [Key] 
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
    public int ProductID { get; set; } 

    [Required] 
    [Display(Name = "Name")] 
    public string ProductName { get; set; } 

//trimmed for brevity 

    [ForeignKey("ParentProductID")] 
    public virtual List<ProductUsed> ProductsUsed { get; set; } 

} 

public class ProductUsed 
{ 

    [Key] 
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
    public int ProductUsedID { get; set; } 

    [Display(Name = "Pre Product")] 
    [Required] 
    public int PreProductID { get; set; } 

    [Display(Name = "Pre Product")] 
    [ForeignKey("PreProductID")] 
    public virtual Product PreProduct { get; set; } 

    [Display(Name = "Product")] 
    [Required] 
    public int ParentProductID { get; set; } 

    public int Quantity { get; set; } 


} 

Das Speichern erfolgt durch Erstellen des Objekts, Hinzufügen der Produkte ProductsUsed Collection und Speichern der Änderungen. Die Datenbank enthält alle Felder an den richtigen Stellen.

Alles, was ich gelesen habe, sagt, dass dies einfach sein sollte, es scheint nur die Anmerkung zu ignorieren. Oder (was wahrscheinlicher ist) Ich verstehe nicht, wie diese Annotation funktionieren soll.

Irgendwelche Zeiger?

Antwort

0

Das Problem ist, dass Sie Ihren Fremdschlüssel im falschen Modell haben. Es soll wie folgt aussehen:

public class Product 
{ 
    [Key] 
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
    public int ProductID { get; set; } 

    [Required] 
    [Display(Name = "Name")] 
    public string ProductName { get; set; } 

    public virtual List<ProductUsed> ProductsUsed { get; set; } 

    public virtual List<ProductUsed> PreProducts { get; set; } 

} 

public class ProductUsed 
{ 

    [Key] 
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
    public int ProductUsedID { get; set; } 

    [Display(Name = "Pre Product")] 
    [Required] 
    public int PreProductID { get; set; } 

    [Display(Name = "Pre Product")] 
    public virtual Product PreProduct { get; set; } 

    [Display(Name = "Product")] 
    [Required] 
    public int ParentProductID { get; set; } 

    public virtual Product ParentProduct { get; set; } 

    public int Quantity { get; set; } 


} 

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<ProductUsed>() 
      .HasRequired(p => p.ParentProduct) 
      .WithMany(p => p.ProductsUsed) 
      .HasForeignKey(p => p.ParentProductID); 
     modelBuilder.Entity<ProductUsed>() 
      .HasRequired(p => p.PreProduct) 
      .WithMany(p => p.PreProducts) 
      .HasForeignKey(p => p.PreProductID) 
      .WillCascadeOnDelete(false); 
    } 

Die Erzeuger in Produkt wird dann durch den Fremdschlüssel in ProductUsed Modell aufgelöst.

BEARBEITEN: Zu fließendem api Modellbauer geändert.

+0

die ForeignKey auf Erzeuger führen zu einer Ausnahme Entfernen ungültigen Spaltennamen geworfen ‚Product_ProductID‘ Mit dem ForeignKey es tut es die richtigen ProductUsed Objekte, wenn ich darauf zugreifen, es ist nur, dass das Produkt, das es war deutet in die falsche Richtung. –

+0

Versuchen Sie, ParentProduct in Product und ParentProductId in ProductId umzubenennen. – Nalipu

+0

Wenn die Umbenennung nicht funktioniert, können Sie das fluent api from entity framework verwenden. Siehe Beispiel [hier] (http://www.entityframeworktutorial.net/code-first/configure-one-to-many-relationship-in-code-first.aspx) – Nalipu

Verwandte Themen