Тип члена в типе не совместим с членом в типе в EF - PullRequest
0 голосов
/ 31 января 2019

В моем приложении ASP.NET MVC 5 у меня есть ActionResult в одном из моих контроллеров, который принимает параметры от клиента и возвращает строку JSON.Проблема в том, что я получаю сообщение об ошибке ниже, когда у меня есть нулевые значения в одной или нескольких записях базы данных.Я могу устранить эту ошибку, приведя все нулевые значения к пустой строке в самой таблице представлений, но я бы предпочел не считать это долгосрочным решением.

System.Data.Entity.Core.MappingException: 'Указанная схема недопустима.Ошибки: EFA.msl (16,12): ошибка 2019: указанное сопоставление элементов недопустимо.Тип 'Edm.String [Nullable = False, DefaultValue =, MaxLength =, Unicode =, FixedLength =]' члена 'ScheduledStartTime' в типе 'EFAModel.v_DemandList' не совместим с '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);

    }

Образец из таблицы вида:

Database Sample

Ответы [ 2 ]

0 голосов
/ 31 января 2019

Сообщение об ошибке ясно!Очевидно, что ScheduledStartTime тип в efa.v_DemandList - это не тот же тип, что и для ScheduledStartTime в таблице базы данных.В вашей модели класс ScheduledStartTime имеет тип string, но в таблице базы данных его тип datatime.

Поэтому измените тип ScheduledStartTime с string на DateTime в модели DemandListclass.

Затем обновите ваш запрос следующим образом:

var dataSet = (from a in efa.v_DemandList
                   where a.ScheduledStartTime.ToString().Contains(searchParam)
                   select a
                   ).Distinct().OrderBy(sortColumn + " " + sortColumnDir);

Здесь я использую .ToString() с ScheduledStartTime, иначе вы не можете использовать Contains(), потому что это тип DateTime.

0 голосов
/ 31 января 2019

Дайте значения по умолчанию в вашем методе действия.Если это на самом деле ноль, вы получите значение по умолчанию.Для целых чисел необходимо указать тип, допускающий обнуление.

[HttpPost]
public ActionResult GetDemandData(int? start=0, int? length=0, etc)
{
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...