与Postgres EF Provider连接时出现NullReferenceException

时间:2016-11-09 09:12:03

标签: postgresql linq asp.net-core

我有一个postgres数据库并使用asp.net core mvc(+ ef)。数据库已正确创建。我有两张桌子'模块'和' ModuleMenu'。我希望得到给定模块的所有菜单,但我仍未能创建linq查询。

情况

型号: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.

有人可以帮我正确创建查询吗?

2 个答案:

答案 0 :(得分: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();
}

答案 1 :(得分:0)

我希望模型出错(ModelID和ID是不兼容的类型)。如果这是正确的,您的代码应该可行。或者更简单:

 (
   `name` LIKE '%test%' ESCAPE '!' 
    OR  `description` LIKE '%test%' ESCAPE '!' 
 )