ASP.Net 一个 table 的数据库查询异常,即使另一个有效
ASP.Net Database query exception for one table even though another works
我需要关于我的程序中断可能是什么问题的建议。我收到以下错误:
NullReferenceException: Object reference not set to an instance of an object.
对于来自一个控制器而不是另一个控制器的查询,它运行在同一个 DbContext 连接上。
我决定使用通用 ASP.Net 核心 WebAPI 模板从头开始。我在下面插入了我的两个 classes,运行 一个构建,并将它们搭建到控制器和视图中,没有任何问题。我什至可以从 SQL Server Object Explorer(在 Visual Studio 2015 Community 中)到 "View Data" 都在 table 中。我什至在给公司 class 的订单 class 中取出了外键引用。这一切都在一台机器上的测试环境中,我具有管理员权限和 DB 上的 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
}
}
更新:我可以为订单控制器的创建视图输入 URL,它会在数据库中插入一条新记录,但重定向到 "Index"[=16 时出错=]
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 table,但是当我注销并尝试登录时总是失败。不确定这种情况何时开始发生,也许这些问题是同一个问题的一部分;但不确定为什么只有一个 table 允许查找,但它们都允许更新。也超出了我的经验,这是 Visual Studio 问题还是 SQL 服务器问题。
更新:在 Max 发表评论后,我将 connectionString 更改为
"Data Source={ServerName}\{InstanceName}; Initial Catalog={DatabaseName}; Integrated Security=True; Connect Timeout=15; MultipleActiveResultSets=true;"
我的 userLogin 数据库和我的 appDatabase。这允许我为用户重新登录。但是它没有让我查询订单 table。因此,我尝试了一个新的 class、州(即美国所有州的 Name/Code),然后搭建了控制器和视图。该查询现在适用于 Company 和 State,但不适用于 Order。所以我认为它与 DBSets 的 DataMineDbContext 中的虚拟关键字有关,因为 State 没有在其中构建它。但这并没有解决我的问题。因此,尽管这是一个命名约定问题,但我在应用程序和我的数据库中都将 Order to Purchase 重命名为 Purchase。这没有帮助。
我在 Database Adminstrators 上从 Brownstone 先生那里了解到,这归结为我的 Order 模型 class 没有为可空类型正确设置属性以匹配我的数据库 table 设置。在这个例子中是 DATETIME?可为空。
我会重新发布链接NRE crash when property isn't marked as nullable. and Null reference when using Take
我需要关于我的程序中断可能是什么问题的建议。我收到以下错误:
NullReferenceException: Object reference not set to an instance of an object.
对于来自一个控制器而不是另一个控制器的查询,它运行在同一个 DbContext 连接上。
我决定使用通用 ASP.Net 核心 WebAPI 模板从头开始。我在下面插入了我的两个 classes,运行 一个构建,并将它们搭建到控制器和视图中,没有任何问题。我什至可以从 SQL Server Object Explorer(在 Visual Studio 2015 Community 中)到 "View Data" 都在 table 中。我什至在给公司 class 的订单 class 中取出了外键引用。这一切都在一台机器上的测试环境中,我具有管理员权限和 DB 上的 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
}
}
更新:我可以为订单控制器的创建视图输入 URL,它会在数据库中插入一条新记录,但重定向到 "Index"[=16 时出错=]
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 table,但是当我注销并尝试登录时总是失败。不确定这种情况何时开始发生,也许这些问题是同一个问题的一部分;但不确定为什么只有一个 table 允许查找,但它们都允许更新。也超出了我的经验,这是 Visual Studio 问题还是 SQL 服务器问题。
更新:在 Max 发表评论后,我将 connectionString 更改为
"Data Source={ServerName}\{InstanceName}; Initial Catalog={DatabaseName}; Integrated Security=True; Connect Timeout=15; MultipleActiveResultSets=true;"
我的 userLogin 数据库和我的 appDatabase。这允许我为用户重新登录。但是它没有让我查询订单 table。因此,我尝试了一个新的 class、州(即美国所有州的 Name/Code),然后搭建了控制器和视图。该查询现在适用于 Company 和 State,但不适用于 Order。所以我认为它与 DBSets 的 DataMineDbContext 中的虚拟关键字有关,因为 State 没有在其中构建它。但这并没有解决我的问题。因此,尽管这是一个命名约定问题,但我在应用程序和我的数据库中都将 Order to Purchase 重命名为 Purchase。这没有帮助。
我在 Database Adminstrators 上从 Brownstone 先生那里了解到,这归结为我的 Order 模型 class 没有为可空类型正确设置属性以匹配我的数据库 table 设置。在这个例子中是 DATETIME?可为空。
我会重新发布链接NRE crash when property isn't marked as nullable. and Null reference when using Take