2016-04-07 20 views
1

Zorunlu "İlk kez soru, bir şeyleri mahvedersem özür dilerim". Umarım birileri yardım edebilir.Varlık Çerçevesi - Yabancı anahtar notu yanlış nesneyi görmezden geliniyor

Varlık çerçevesi 6, .net 4.5.

Ürünüm var. Bir ürün diğer ürünlerden belirli bir miktardan üretilebilir, bu nedenle "PreProductID" i işaret eden yabancı anahtar için bir sanal Ürün üzerinde bir açıklama ile birlikte iki ProductIDs, biri ParentProductID ve bir PreProductID denilen bir ProductUsed sınıfı oluşturdum. . Her eriştiğimde ürünü ParentProductID için yüklüyor.

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


} 

Tasarruf o ana ürünleri ProductsUsed toplanması ve ardından azaltacak değişiklikler ekleyerek nesnesi oluşturarak yapılır. Veritabanının doğru yerlerde tüm alanları vardır.

Okuduğum her şey, bunun doğrudan doğruya olması gerektiğini söylüyor, sadece ek açıklamaları göz ardı ediyor gibi görünüyor. Ya da (tamamen daha muhtemel olduğu gibi) Bu notun nasıl çalıştığını anlamıyorum.

İşaretçiler var mı?

cevap

0

Sorun şu ki yabancı anahtarın yanlış modele sahip. Bu gibi görünmelidir: Üründeki

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

ProductsUsed sonra ProductUsed modelinde yabancı anahtar ile çözülür.

DÜZENLEME: Akıcı api model oluşturucu olarak değiştirildi. Bir istisna içinde ProductsUsed sonuçlarına ForeignKey Çıkarma

+0

Geçersiz sütun adının atılan 'Product_ProductID' orada ben eriştiklerinde doğru ProductUsed nesneleri olsun ForeignKey ile öyleydi Ürün orada işaret ediyordu bu sadece var yanlış yön. –

+0

Ürünü Ana Ürüne ve ÜrünÜrüne Ürün Verilerini Yeniden Adlandırmayı deneyin. – Nalipu

+0

Yeniden adlandırma çalışmıyorsa, akıcı api'yi varlık çerçevesinden kullanabilirsiniz. Bkz. Örnek [burada] (http://www.entityframeworktutorial.net/code-first/configure-one-to-many-relationship-in-code-first.aspx) – Nalipu