在我的ASP.NET MVC 5应用程序中,我的一个控制器中有一个ActionResult
,该控制器从客户端获取参数并返回JSON字符串。
问题是,当我在一个或多个数据库记录中具有空值时,出现以下错误。我可以通过将所有null值强制转换为视图表本身中的空字符串来清除此错误,但我不希望将其作为长期解决方案。
System.Data.Entity.Core.MappingException:'指定的架构无效。错误: EFA.msl(16,12):错误2019:指定的成员映射无效。类型'EFAModel.v_DemandList'中的成员'ScheduledStartTime'的类型'Edm.String [Nullable = False,DefaultValue =,MaxLength =,Unicode =,FixedLength =]'与'SqlServer.datetime [Nullable = False,DefaultValue)不兼容=,Precision = 3]'成员'ScheduledStartTime',类型为'EFAModel.Store.v_DemandList'。'
关于如何应对这种情况的任何建议?
[HttpPost]
public ActionResult GetDemandData()
{
//get basic parameters from DataTables
var draw = Request.Form.GetValues("draw").FirstOrDefault();
var start = Request.Form.GetValues("start").FirstOrDefault();
var length = Request.Form.GetValues("length").FirstOrDefault();
//Find Order Column
var sortColumn = Request.Form.GetValues("columns[" + Request.Form.GetValues("order[0][column]").FirstOrDefault() + "][name]").FirstOrDefault();
var sortColumnDir = Request.Form.GetValues("order[0][dir]").FirstOrDefault();
//find search parameters
var searchParam = Request.Form.GetValues("search[value]")[0];
//build return dataset
int pageSize = length != null ? Convert.ToInt32(length) : 0;
int skip = start != null ? Convert.ToInt32(start) : 0;
int recordsTotal = 0;
//materialize dataset using serch parameters
EFAEntities efa = new EFAEntities();
//*** throws error when database table contains null values ***
var dataSet = (from a in efa.v_DemandList
where a.ScheduledStartTime.Contains(searchParam)
select a
).Distinct().OrderBy(sortColumn + " " + sortColumnDir);
recordsTotal = dataSet.Count();
var data = dataSet.Skip(skip).Take(pageSize).ToList();
return Json(new { draw = draw, recordsFiltered = recordsTotal, recordsTotal = recordsTotal, data = data }, JsonRequestBehavior.AllowGet);
}
视图表中的示例:
答案 0 :(得分:1)
错误消息已清除!明确地说,ScheduledStartTime
中的efa.v_DemandList
类型与数据库表中ScheduledStartTime
的类型不同。在模型类中,ScheduledStartTime
是string
类型,但在数据库表中是datatime
类型。
因此,请在ScheduledStartTime
模型类中将string
的类型从DateTime
更改为DemandList
。
然后按以下方式更新查询:
var dataSet = (from a in efa.v_DemandList
where a.ScheduledStartTime.ToString().Contains(searchParam)
select a
).Distinct().OrderBy(sortColumn + " " + sortColumnDir);
这里我将.ToString()
与ScheduledStartTime
一起使用,否则您不能使用Contains()
,因为它的类型为DateTime
。
答案 1 :(得分:0)
在您的操作方法中提供默认值。如果实际上为空,则将获得默认值。对于整数,您需要提供可为null的类型。
[HttpPost]
public ActionResult GetDemandData(int? start=0, int? length=0, etc)
{