为什么不能在实体框架中继承模型的视图模型

时间:2014-05-30 13:25:58

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

当我在开发应用程序时,我收到了一个错误:

Value cannot be null. Parameter name: input

有一个lots of post talking about that所以我读了它们......没有解决方案。

继续说好。所以我检查了数据库模型中是否存在任何不可为空的属性,试图插入而不是,所有这些属性都可以为空(除了Identity)以便这不是问题。所以我意识到,抛出错误的View Model 是从Model类继承而我想:“可能是问题吗?”。所以我不再继承模特并重新开始工作。

请注意,这不是第一次发生这种情况,两周前我遇到了同样的情况而且是因为它。

为什么我继承了模型类?因为它有+10个属性,我需要它在视图中显示这些值,但我还需要显示另一个模型类的值,所以我创建了一个视图模型:

class ViewModel: ModelClass{

    //ModelClass contains +10 properties
    //and the current class contains 7 properties

    public ModelClass CastToModelClass()
    {
        return new ModelClass{ /*stuff...*/ }// casting the current properties values to the ModelClass class
    }
}

当我插入新铸造的模型时,我收到错误:

public JsonResult Save(ViewModel model)
{
    var modelClass = model.CastToModelClass();
    // here there are not empty properties
    context.ModelClass.Add(modelClass);
    context.SaveChanges();// error throw
}

所以我的问题是,为什么从Model类继承错误

2 个答案:

答案 0 :(得分:8)

您的问题"为什么从Model类继承错误?" 来自错误的假设,此问题是由继承引起的。从概念上讲不建议这样做,但从技术上讲,正确编程时不应引起任何问题。

其他人已经回应了为什么使用实体框架模型作为视图模型的(部分)并不是一个好主意,所以我将解决手头的技术问题。

鉴于你这样做:

var modelClass = model.CastToModelClass();
context.ModelClass.Add(modelClass);
context.SaveChanges();

并且CastToModelClass()返回EF模型,使您的继承问题无关紧要。问题必须在准备并返回新ModelClass实体的代码中。

如果你这样做

var entityModel = new ModelClass
{
    Prop1 = model.Prop1,
    Prop2 = model.Prop2,
    // ...
};
context.ModelClass.Add(entityModel);
context.SaveChanges();

你基本上都是这样做的。这应该工作;如果它没有,你就没有正确映射所有属性。问题不在于继承。

答案 1 :(得分:4)

modelview model是两个截然不同的概念。模型与应用程序的业务逻辑相关,而视图模型是此模型对视图的直接适配器(因此,视图模型)。

此外,虽然它们可能共享一些属性和功能,但视图模型将根据需要在视图中显示的内容的需求而发展;在某些情况下,您将拥有与单个模型相关的多个视图模型。

在您的示例中,您已尝试通过

将视图模型转换为模型
var modelClass = model.CastToModelClass();

这本身就是一个断言,你正在处理两个不同的概念。模式本身(返回具有给定属性集的模型类)并不错;但是,继承模型类是完全没必要的。

class ViewModel : ModelClass // <-- Remove inheritance