0

ProductテーブルとCategoryテーブルには、1対多数の関係があります。私は製品からカテゴリー名を取得したいが、何らかのエラーが出る。 私のコードは新しいデータベースの最初のプロジェクトを作成していますが、asp.netのコアプロジェクトで作業していません。複数レイヤーのリポジトリパターンコード.netコアの最初の関係

public class Category : IEntity 
    { 
     public Category() 
     { 
      Children = new List<Category>(); 
      Products = new List<Product>(); 
     } 
     public int CategoryId { get; set; } 
     public string CategoryName { get; set; } 
     public int? ParentCategoryId { get; set; } 
     public string Description { get; set; } 
     public bool IsActive { get; set; } 
     public bool? IsParent { get; set; } 
     public string LangCode { get; set; } 
     public virtual Category Parent { get; set; } 
     public virtual ICollection<Category> Children { get; set; } 
     public virtual ICollection<Product> Products { get; set; } 
    } 



public class Product : IEntity 
    { 
     public int ProductId { get; set; } 
     public string ProductName { get; set; } 
     public int? CategoryId { get; set; } 
     public decimal UnitPrice { get; set; } 
     public short? UnitsInStock { get; set; } 
     public string Description { get; set; } 
     public string ProductCode { get; set; } 
     public bool? IsActive { get; set; } 
     public string UnitCode { get; set; } 
     public double? GrossWeight { get; set; } 
     public double? NetWeight { get; set; } 
     public DateTime? CreateDate { get; set; } 
     public DateTime? UpdateDate { get; set; } 
     public int? CreateUser { get; set; } 
     public int? UpdateUser { get; set; } 
     public double? Length { get; set; } 
     public double? Width { get; set; } 
     public double? Height { get; set; } 
     public string SizeUnitCode { get; set; } 
     public string Brand { get; set; } 
     public string AlternateProductCode { get; set; } 
     [ForeignKey("CategoryId")] 
     public virtual Category Category { get; set; } 
    } 

public class DataContext:DbContext 
{ 
    public static string ConnectionString { get; set; } 
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) 
    {   
     optionsBuilder.UseSqlServer(ConnectionString); 
    } 
    public DbSet<Page> Pages { get; set; } 
    public DbSet<Category> Categories { get; set; } 
    public DbSet<Product> Products { get; set; } 
    protected override void OnModelCreating(ModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Category>() 
       .HasOne(i => i.Parent) 
       .WithMany(i => i.Children) 
       .HasForeignKey(i => i.ParentCategoryId); 
     modelBuilder.Entity<Product>() 
      .HasOne(p => p.Category) 
      .WithMany(b => b.Products) 
      .HasForeignKey(f => f.CategoryId); 
    } 
} 
public void ConfigureServices(IServiceCollection services) 
     { 
      services.AddScoped<IPageService, PageManager>(); 
      services.AddScoped<IPageDal, EfPageDal>(); 
      services.AddScoped<ICategoryService, CategoryManager>(); 
      services.AddScoped<ICategoryDal, EfCategoryDal>(); 
      services.AddScoped<IProductService, ProductManager>(); 
      services.AddScoped<IProductDal, EfProductDal>(); 
      services.AddSession(); 
      services.AddDistributedMemoryCache(); 
      services.AddMvc(); 
      DataContext.ConnectionString = Configuration.GetConnectionString("DefaultConnection"); 
     } 

    public class EfEntityRepositoryBase<TEntity, TContext> : IEntityRepository<TEntity> 
     where TEntity : class, IEntity, new() 
     where TContext : DbContext, new() 
    { 


     public List<TEntity> GetList(Expression<Func<TEntity, bool>> filter = null) 
     { 
      using (var context = new TContext()) 
      { 
       return filter == null 
        ? context.Set<TEntity>().ToList() 
        : context.Set<TEntity>().Where(filter).ToList(); 
      } 
     } 
    } 

screen

+2

おそらく、リポジトリメソッドに '.Include(x => x.Category)'が必要です。すべてのものを基本エンティティから継承するように設定する - エンティティフレームワークに疲れて、すべてをディスクリミネータ(階層ごとのテーブル)にまとめる。 – Mardoxx

+0

答えのためのタンク@Mardoxx。私はあなたがコードを含むsugestedをどこで使うのか分かりません。私は質問に自分のリポジトリメソッドを追加しました。私のリポジトリメソッドをチェックできますか? – FDemirci

答えて

0

私は、コードを次のようなデータを取得します。しかし、このコードは馬鹿です。私はその問題を解決する良いアイデアを待っています。

public ActionResult Index() 
{ 
    ProductListViewModel model = new ProductListViewModel 
    { 
     Products = _productService.GetAll() 
    }; 

    model.Products.ForEach(b => 
    { 
     b.ProductCategory = _categoryService.GetByID(b.CategoryId); 
    }); 

    return View(model); 
} 
関連する問題