ASP.Net即使另一个表的数据库查询异常

问题描述:

我需要关于在我的程序中可能出现问题的建议。我收到以下错误:ASP.Net即使另一个表的数据库查询异常

NullReferenceException: Object reference not set to an instance of an object.

针对来自一个控制器的查询,但不是运行相同DbContext连接的另一个控制器。

我决定用通用的ASP.Net Core WebAPI模板从头开始重新开始。我在下面插入了我的两个类,运行了一个构建,并将它们搭建到控制器和视图中,没有任何问题。我甚至有能力从SQL Server对象资源管理器(在Visual Studio 2015社区中)查看两个表中的“查看数据”。我甚至将Order类中的Foreign Key引用移出给Company类。这一切都在一台机器上的测试环境中,我拥有管理员权限和数据库上的dbo。

public class Order{ } 
public class Company { } 

public class DataMineDbContext : DbContext 
{ 
    public DataMineDbContext(DbContextOptions<DataMineDbContext> options) : base(options) { } 
    public virtual DbSet<Company> Company { get; set; } 
    public virtual DbSet<Order> Order { get; set; } 
} 

public class CompaniesController : Controller 
{ 
    private readonly DataMineDbContext _context; 

    public CompaniesController(DataMineDbContext context) 
    { 
     _context = context;  
    } 

    // GET: Companies 
    public async Task<IActionResult> Index() 
    { 
     return View(await _context.Company.ToListAsync()); //this works 
    } 
} 

public class OrdersController : Controller 
{ 
    private readonly DataMineDbContext _context; 

    public OrdersController(DataMineDbContext context) 
    { 
     _context = context;  
    } 

    // GET: Orders 
    public async Task<IActionResult> Index() 
    { 
     return View(await _context.Order.ToListAsync()); //this throws error 
     //An unhandled exception of NullReferenceException 
    } 
} 

更新:我可以在网址为我的订单控制器创建视图类型,它会插入一个新的记录到数据库,但错误的重定向到“索引”

public async Task<IActionResult> Create(int id, [Bind("Color,CompanyId,Delivered,Filled,ItemName,OrderNumb,Ordered,Price,Qty,Size")] Order order) 
    { 
     order.CompanyId = id; 
     if (ModelState.IsValid) 
     { 
      _context.Add(order); 
      await _context.SaveChangesAsync(); 
      return RedirectToAction("Index"); 
     } 
     return View(order); 
    } 
} 

侧注:我在同一台服务器上的单独数据库中设置了我的个人帐户登录。我也可以注册一个用户(插入)到AspNetUsers表中,但是当我注销并尝试登录时,它总是失败。不知道这是什么时候开始发生的,也许这些问题是同一问题的一部分;但仍然不确定为什么只有一个表允许查找,但它们都允许更新。同样超出我的经验,无论这是Visual Studio问题还是SQL Server问题。

更新:最大的评论后,我改变了我的connectionString到

"Data Source={ServerName}\{InstanceName}; Initial Catalog={DatabaseName}; Integrated Security=True; Connect Timeout=15; MultipleActiveResultSets=true;"

两个我USERLOGIN数据库和我appDatabase。这使我可以重新登录为用户。它并没有让我查询Order表。因此,我尝试了一个新课程,即State(作为美国所有州的名称/代码),然后我将这个控制器和视图组装起来。该查询现在适用于公司和州,但不适用于订单。所以我认为这与DBSets的DataMineDbContext中的virtual关键字有关,因为State没有支撑它。但是这并没有解决我的问题。因此,我认为它是一个命名约定事项,并在应用程序和我的数据库中重命名为Order to Purchase。这并没有帮助。

+0

和你确定订单已在数据库中的价值? – Usman

+0

@Usman有两条记录。 “我甚至有能力从SQL Server对象资源管理器到两个表中的”查看数据“。”这也只是索引和编辑中的一个问题。如果我输入一个创建网址,它会将我带到视图并保存一条新记录。我甚至更新了代码以显示订单控制器中的创建操作 – Edward

+1

检查是否存在'MultipleActiveResultSets = true;'您的连接字符串 – Max

我从布朗斯通先生了解到Database Adminstrators它归结为我的Order模型类的属性未正确设置为可空类型以匹配我的数据库表设置。在这种情况下为DATETIME?空。

我会重新发布链接NRE crash when property isn't marked as nullable.Null reference when using Take