当我在开发应用程序时,我收到了一个错误:
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类继承错误?
答案 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)
model
和view model
是两个截然不同的概念。模型与应用程序的业务逻辑相关,而视图模型是此模型对视图的直接适配器(因此,视图模型)。
此外,虽然它们可能共享一些属性和功能,但视图模型将根据需要在视图中显示的内容的需求而发展;在某些情况下,您将拥有与单个模型相关的多个视图模型。
在您的示例中,您已尝试通过
将视图模型转换为模型var modelClass = model.CastToModelClass();
这本身就是一个断言,你正在处理两个不同的概念。模式本身(返回具有给定属性集的模型类)并不错;但是,继承模型类是完全没必要的。
class ViewModel : ModelClass // <-- Remove inheritance