类型成员与EF中类型成员不兼容

时间:2019-01-30 22:09:03

标签: c# asp.net-mvc entity-framework linq

在我的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);

    }

视图表中的示例:

Database Sample

2 个答案:

答案 0 :(得分:1)

错误消息已清除!明确地说,ScheduledStartTime中的efa.v_DemandList类型与数据库表中ScheduledStartTime的类型不同。在模型类中,ScheduledStartTimestring类型,但在数据库表中是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)
{