В моем приложении ASP.NET MVC 5 у меня есть ActionResult в одном из моих контроллеров, который принимает параметры от клиента и возвращает строку JSON.
Проблема в том, что я получаю сообщение об ошибке ниже, когда у меня есть нулевые значения в одной или нескольких записях базы данных. Я могу устранить эту ошибку, приведя все нулевые значения к пустой строке в самой таблице представления, но я бы не хотел использовать это как долгосрочное решение.
System.Data.Entity.Core.MappingException: 'Schema specified is not valid. Errors: EFA.msl(16,12) : error 2019: Member Mapping specified is not valid. The type 'Edm.String[Nullable=False,DefaultValue=,MaxLength=,Unicode=,FixedLength=]' of member 'ScheduledStartTime' in type 'EFAModel.v_DemandList' is not compatible with 'SqlServer.datetime[Nullable=False,DefaultValue=,Precision=3]' of member 'ScheduledStartTime' in type '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);
}
Пример из таблицы просмотра:





Дайте значения по умолчанию в вашем методе действия. Если это на самом деле нулевое значение, вы получите значение по умолчанию. Для целых чисел вам необходимо указать тип, допускающий значение NULL.
[HttpPost]
public ActionResult GetDemandData(int? start=0, int? length=0, etc)
{
Сообщение об ошибке понятно! Это ясно говорит о том, что тип 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 проблемы из 2 частей. Другой частью была проблема сопоставления с самой моделью Entity. Я перезагрузил модель данных, и теперь она работает как чемпион.
Эта ошибка говорит, что тип данных
ScheduledStartTimeвEFAEntitiesявляется строкой (!?) , но в вашей базе данных это поле имеет тип данныхDateTime. Вы пытаетесь совместить их типы данных?!