C# 正在联接表,未设置获取对象引用
我正在将一个现有的程序转换为MVC5,我需要从一个数据库连接多个表。我做了一个虚拟项目来进行实验,这样我就不会对任何东西造成不可修复的损坏,而且我已经成功地将数据库中的所有表都拉出来并显示出来了。然而,当我尝试加入它们时,我得到“对象引用未设置为对象的实例” 注意:产品和任务是数据库中现有的模型和表。它已经部署好了,我们不能改变它们 相关控制器代码:C# 正在联接表,未设置获取对象引用,c#,mysql,asp.net,asp.net-mvc,asp.net-mvc-5,C#,Mysql,Asp.net,Asp.net Mvc,Asp.net Mvc 5,我正在将一个现有的程序转换为MVC5,我需要从一个数据库连接多个表。我做了一个虚拟项目来进行实验,这样我就不会对任何东西造成不可修复的损坏,而且我已经成功地将数据库中的所有表都拉出来并显示出来了。然而,当我尝试加入它们时,我得到“对象引用未设置为对象的实例” 注意:产品和任务是数据库中现有的模型和表。它已经部署好了,我们不能改变它们 相关控制器代码: public ActionResult Index() { _db.Configuration.ProxyCreation
public ActionResult Index()
{
_db.Configuration.ProxyCreationEnabled = false;
var JoinTest = (
from a in _db.Task.AsEnumerable()
join b in _db.Product on a.ProductId equals b.ProductId
select new
{
TaskId = a.TaskId,
TaskDesc = a.TaskDescription,
ProdDesc = b.ProductDescription
});
ViewData["CompositeData"] = JoinTest;
ViewData["ProductData"] = _db.Product.ToList();
}
查看代码:
@foreach (var item in ViewData["CompositeData"] as List<TomFoolery.Models.ViewModel>)
{
//Printing relevant items from DB
}
那么,我哪里出错了?ViewData[“CompositeData”]as List
将返回null,因为您设置为ViewData[“CompositeData”]
的项是匿名类型的列表
您应该创建一个视图模型并使用它
public class MyViewModel
{
public int TaskId {set;get;}
public string TaskDesc {set;get;}
public string ProductDesc {set;get;}
}
在投影部分使用它
ViewData["CompositeData"] = (
from a in _db.Task.AsEnumerable()
join b in _db.Product on a.ProductId equals b.ProductId
select new MyViewModel
{
TaskId = a.TaskId,
TaskDesc = a.TaskDescription,
ProdDesc = b.ProductDescription
}).ToList();
在视图中,需要强制转换到此视图模型集合
@foreach (var item in ViewData["CompositeData"] as List<TomFoolery.Models.MyViewModel>)
{
<p>@item.TaskId</p>
}
在您的视图中,它是我们新的视图模型的强类型
@model MyPageViewModel
@foreach(var item in Model.Tasks)
{
<p>@item.TaskId</p
<p>@item.TaskDesc</p>
<p>@item.ProdDesc</p>
}
@model MyPageViewModel
@foreach(Model.Tasks中的var项)
{
@item.TaskIdViewData[“CompositeData”]as List
将返回null,因为设置为ViewData[“CompositeData”]
的项是匿名类型的列表
您应该创建一个视图模型并使用它
public class MyViewModel
{
public int TaskId {set;get;}
public string TaskDesc {set;get;}
public string ProductDesc {set;get;}
}
在投影部分使用它
ViewData["CompositeData"] = (
from a in _db.Task.AsEnumerable()
join b in _db.Product on a.ProductId equals b.ProductId
select new MyViewModel
{
TaskId = a.TaskId,
TaskDesc = a.TaskDescription,
ProdDesc = b.ProductDescription
}).ToList();
在视图中,需要强制转换到此视图模型集合
@foreach (var item in ViewData["CompositeData"] as List<TomFoolery.Models.MyViewModel>)
{
<p>@item.TaskId</p>
}
在您的视图中,它是我们新的视图模型的强类型
@model MyPageViewModel
@foreach(var item in Model.Tasks)
{
<p>@item.TaskId</p
<p>@item.TaskDesc</p>
<p>@item.ProdDesc</p>
}
@model MyPageViewModel
@foreach(Model.Tasks中的var项)
{
@item.TaskId
JoinTest
是一个IEnumerable
,因此不能将其强制转换到列表中
JoinTest
是一个IEnumerable
,因此不能将其强制转换到列表中
我必须编辑模型还是不编辑该函数?这取决于ViewModel
的定义是否与匿名类型相同。如果是,它应该可以工作。否则,请按照Shyju的回答进行操作。注意。感谢您的帮助。我必须编辑模型还是不编辑该函数?这取决于的定义de>ViewModel
是否与匿名类型相同。如果是,它应该可以工作。否则,请按照Shyju的回答进行操作。注意。感谢您的帮助。将JoinTest变量(IQueryble)传递到视图不是也有问题吗。即使toList()在呈现视图时对该变量调用,_db可能已被释放,因为控制器已被释放。请注意,可能与此问题有关。需要一些生命周期深入验证。将JoinTest变量(IQueryble)传递到视图不是也有问题吗。即使toList()在呈现视图时对该变量调用,_db可能已被释放,因为控制器已被释放。请注意,可能与此问题有关。需要进行一些生命周期深入验证。
var JoinTest = (
from a in _db.Task.AsEnumerable()
join b in _db.Product on a.ProductId equals b.ProductId
select new TomFoolery.Models.ViewModel /* changed */
{
TaskId = a.TaskId,
TaskDesc = a.TaskDescription,
ProdDesc = b.ProductDescription
});
ViewData["CompositeData"] = JoinTest.ToList(); /*changed */