2016-11-09 12 views
0

私はpostgresデータベースを持ち、asp.net core mvc(+ ef)を使用しています。データベースが正しく作成されます。私は2つのテーブル 'Module'と 'ModuleMenu'を持っています。私は与えられたモジュールのすべてのメニューを取得したいと思いますが、私はlinqクエリを作成することに失敗し続けます。Postgres EFプロバイダとの結合でNullReferenceExceptionが発生しました

状況

モデル:Module.cs

namespace project.Model 
{ 
    public class Module 
    {  
     [Required] 
     public string ID { get; set; } 

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

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

モデル:ModuleMenu.cs

namespace project.Models 
{ 
    public class ModuleMenu 
    { 
     [Required] 
     public string ID { get; set; } 

     public int ModuleID { get; set; } 

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

     [ForeignKey("ModuleID")] 
     public virtual Module Module { get; set; } 
    } 
} 

ApplicationDbContext.cs

namespace project.Data 
{ 
    public class ApplicationDbContext 
    { 
     public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) 
      : base(options) 
     { 
     } 

     protected override void OnModelCreating(ModelBuilder modelBuilder) 
     { 
      base.OnModelCreating(modelBuilder); 
     } 


     public DbSet<Module> Modules { get; set; } 

     public DbSet<ModuleMenu> ModuleMenus { get; set; } 
    } 
} 

クエリ

public List<ModuleMenu> GetModuleMenus(){ 
    var query = from m in _dbContext.ModuleMenus 
       join mod in _dbContext.Modules on 
        m.ModuleID equals mod.ID 
       select m; 

    return query.ToList(); 
} 

エラー

fail: Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware[0] 
     An exception was thrown attempting to execute the error handler. 
System.NullReferenceException: Object reference not set to an instance of an object. 

誰も私が正しくクエリを作成するのに役立つことはできますか?

+1

タグを正しく使用する方法と質問タイトルに強制しない理由については、ヘルプセンターhttp://stackoverflow.com/help/taggingを参照してください。あなたの問題を短期間で記述するためにタイトルを使用するのではなく、質問ページからあなたに答えがあるかどうかを推測するのが簡単になります – Tseng

答えて

2

コードのこの部分は正しいですか?

public int ModuleID { get; set; } 

fkに使用されているタイプにエラーがあるようです。 以下はint型ではなく文字列型に変更しました。

public string ModuleID { get; set; } 

は、その更新に基づいて、クエリは次のようになります。

public ModuleMenu[] GetModuleMenusForModule(string moduleId) 
{ 
    return _dbContext.ModuleMenus.Where(x => x.ModuleID == moduleId).ToArray(); 
} 
0

モデルのエラー(ModelIDとIDは互換性のないタイプ)が予想されます。それが正しければ、あなたのコードはうまくいくはずです。またはより簡単に:

public List<ModuleMenu> GetModuleMenus() 
{ 
    return _dbContext.ModuleMenus.ToList(); 
} 
関連する問題