2

Как я могу получить класс, чтобы иметь коллекцию, состоящую из другой модели, и заполнять ее, когда я беру исходную модель. У меня есть список желаний, и в этом списке желаний есть 0 или много продуктов. Что нужно сделать для аннотации данных или для свободного API, чтобы это было заполнено, если бы я сделал db.Wishlist.find (id). Вот то, что я в настоящее время в моем списке моделиEF Code First One To Many

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.ComponentModel.DataAnnotations; 
using System.ComponentModel.DataAnnotations.Schema; 

namespace Models 
{ 
    [Table("Wishlist")] 
    public class Wishlist 
    { 
     [Key] 
     [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
     [ScaffoldColumn(false)] 
     public int ID { get; set; } 

     [StringLength(100)] 
     public string Name { get; set; } 

     public int ProductID { get; set; } 

     public virtual ICollection<Product> Product { get; set; } 

     public int CustomerID { get; set; } 

     [Required] 
     public Customer Customer { get; set; } 

     public virtual List<Product> Products { get; set; } 

     [DisplayFormat(DataFormatString = "{0:f}")] 
     public DateTime CreateDate { get; set; } 


     [DisplayFormat(DataFormatString = "{0:f}")] 
     public DateTime LastModifiedDate { get; set; } 


    } 
} 

, что требуется, чтобы получить продукты для заполнения или как коллекция или в виде списка. Каков правильный подход к достижению этого? Я знаю, что одна из коллекций продуктов должна идти, просто не уверен, что и что нужно.

ОБНОВЛЕНИЕ: добавлен показ моей модели продукта.

namespace Models 
{ 
    using System; 
    using System.Collections.Generic; 
    using System.ComponentModel.DataAnnotations; 
    using System.ComponentModel.DataAnnotations.Schema; 
    using System.Data.Entity.Spatial; 

    [Table("Product")] 
    public partial class Product 
    { 
     [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")] 
     public Product() 
     { 
      OrderLines = new HashSet<OrderLine>(); 
      SKU_Table = new HashSet<Sku>(); 
      XREF_CatalogProduct = new HashSet<XREF_CatalogProduct>(); 
      ProductImages = new List<ProductImage>(); 
     } 

     [Key] 
     [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
     public int ID { get; set; } 

     [NotMapped] 
     public string FormattedPrice { get { return this.Price.ToString("C"); } } 

     [Required] 
     [MaxLength] 
     public string PageURL { get; set; } 

     [Required] 
     [StringLength(250)] 
     public string Name { get; set; } 

     [Required] 
     public string Code { get; set; } 

     public string Description { get; set; } 

     public int CategoryID { get; set; } 

     [Column(TypeName = "money")] 
     [DisplayFormat(DataFormatString = "${0:#,0}", ApplyFormatInEditMode = true)] 
     public decimal Price { get; set; } 

     public DateTime? DateCreated { get; set; } 

     public DateTime? DateModified { get; set; } 

     [Required]   
     public bool Featured { get; set; } 

     public virtual string ImagePath { get; set; } 

     public virtual Category Category { get; set; }   

     [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] 
     public virtual ICollection<OrderLine> OrderLines { get; set; } 

     [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] 
     public virtual ICollection<Sku> SKU_Table { get; set; } 

     [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] 
     public virtual ICollection<XREF_CatalogProduct> XREF_CatalogProduct { get; set; } 

     public virtual ICollection<ProductImage> ProductImages { get; set; } 
    } 
} 
+1

вы можете показать свой 'модель Product' также? – Sampath

+0

@ Sampath обновил его – ddeamaral

+0

Вам нужно знать, как настроить отношения «1: M» с «Wishlist» и «Product» или иначе? – Sampath

ответ

2

Вы должны настроить M: M отношения с Wishlist : Product .Code первым создаст Junction table для вас, если вы используете DataAnnotation.

Использование DataAnnotation:

[Table("Wishlist")] 
public class Wishlist 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    [ScaffoldColumn(false)] 
    public int ID { get; set; } 

    [StringLength(100)] 
    public string Name { get; set; } 

    public int CustomerID { get; set; } 

    [Required] 
    public Customer Customer { get; set; } 

    [DisplayFormat(DataFormatString = "{0:f}")] 
    public DateTime CreateDate { get; set; } 


    [DisplayFormat(DataFormatString = "{0:f}")] 
    public DateTime LastModifiedDate { get; set; } 

    public virtual ICollection<Product> Products { get; set; } 

} 

И

[Table("Product")] 
    public partial class Product 
    { 
     [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")] 
     public Product() 
     { 
      OrderLines = new HashSet<OrderLine>(); 
      SKU_Table = new HashSet<Sku>(); 
      XREF_CatalogProduct = new HashSet<XREF_CatalogProduct>(); 
      ProductImages = new List<ProductImage>(); 
      this.Wishlists = new HashSet<Wishlist>(); 

     } 

     [Key] 
     [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
     public int ID { get; set; } 

     [NotMapped] 
     public string FormattedPrice { get { return this.Price.ToString("C"); } } 

     [Required] 
     [MaxLength] 
     public string PageURL { get; set; } 

     [Required] 
     [StringLength(250)] 
     public string Name { get; set; } 

     [Required] 
     public string Code { get; set; } 

     public string Description { get; set; } 

     public int CategoryID { get; set; } 

     [Column(TypeName = "money")] 
     [DisplayFormat(DataFormatString = "${0:#,0}", ApplyFormatInEditMode = true)] 
     public decimal Price { get; set; } 

     public DateTime? DateCreated { get; set; } 

     public DateTime? DateModified { get; set; } 

     [Required]   
     public bool Featured { get; set; } 

     public virtual string ImagePath { get; set; } 

     public virtual Category Category { get; set; }   

     [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] 
     public virtual ICollection<OrderLine> OrderLines { get; set; } 

     [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] 
     public virtual ICollection<Sku> SKU_Table { get; set; } 

     [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] 
     public virtual ICollection<XREF_CatalogProduct> XREF_CatalogProduct { get; set; } 

     public virtual ICollection<ProductImage> ProductImages { get; set; } 

     public virtual ICollection<Wishlist> Wishlists { get; set; } 


    } 

EF Запрос: для получения wishlist согласно product Id

var prod_id=1; // your product id 

var query= from wishlist in db.Wishlists 
      where wishlist.Products.Any(c=>c.Product_ID== prod_id) 
      select wishlist; 

Использование Fluent Апи:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 

     modelBuilder.Entity<Wishlist>() 
        .HasMany<Product>(s => s.Products) 
        .WithMany(c => c.Wishlists) 
        .Map(cs => 
          { 
           cs.MapLeftKey("WishlistRefId"); 
           cs.MapRightKey("ProductRefId"); 
           cs.ToTable("WishlistProduct"); 
          }); 

    } 

EF Запрос: для получения wishlist согласно product Id

var prod_id=1; // your product id 

var query= from wishlist in db.Wishlists 
      where wishlist.Products.Any(c=>c.ProductRefId == prod_id) 
      select wishlist;