mvc 5:可选的模型属性

时间:2014-12-12 21:55:22

标签: asp.net-mvc stored-procedures asp.net-mvc-5

我有一个名为Project

的模型
public class Project
{
    [Key]
    public int    ID      { set; get; }
    public string Title   { set; get; }
    public string Image   { set; get; }
    public double? gained { set; get; }
}

我将此模型与两个存储过程一起使用,一个返回所有属性,另一个没有属性gained。我收到了这个错误

The data reader is incompatible with the specified 'Test.Models.Project'. A member of the type, 'Gained', does not have a corresponding column in the data reader with the same name.

我不想为每个存储过程编写单独的模型。 请问如何解决?

1 个答案:

答案 0 :(得分:2)

datareader在某种意义上是愚蠢的,它只会匹配发送给它的内容。如果缺少某列,则会失败,如您所见。

解决此问题的最简单方法是更新存储过程中的第二个SELECT语句,以传回一个名为gain的列。

SELECT ID, Title, Image, NULL as gained FROM table

在这里,我们将没有数据(NULL)作为获得的列传回。这应该使数据阅读器满意,使您不需要多个模型,也不会发回任何额外的数据。

另一种可能性是在模型中使用继承。有一个不包含获得的基础模型,并且有一个继承自包含获得的基础模型的第二个模型。

public class ProjectBase
{
    [Key]
    public int    ID      { set; get; }
    public string Title   { set; get; }
    public string Image   { set; get; }
}

public class ProjectGained : ProjectBase{
    public double? gained { set; get; }
}