C#viewmodel:model - >无法进行类型转换工作

时间:2011-02-28 01:44:06

标签: c# casting viewmodel subclass superclass

我正在使用EF创建一个linq-to-sql模型,并且有一个运行良好的类,但是,我希望能够添加到类中,并且当我使用EF进行更改时不会覆盖它们,所以我相信我需要使用第二层视图类。

所以,我有:

public partial class People: INotifyPropertyChanging, INotifyPropertyChanged {...} // created by EF

然后想做:

public partial class ViewPeople: People {
   public String someFunction() {...} // additional functionality
}

然而,当我尝试使用下面的代码从People转换为ViewPeople时,我得到一个例外:

无法将“Namespace.Models.People”类型的对象强制转换为“Namespace.Models.ViewPeople”

代码:

//select the person
NSDataContext dc = new NSDataContext(); // to get to the data context and models froM EF
var person = (from p in dc.Peoples where p.id == personID select p).First();

// pass model to view
return View((ViewPeople)person)

如果我只是通过人,我可以访问所有“人物”属性和方法。 当我修改ViewPeople类时,我可以在引用“this”时访问超级“People”类的所有属性和方法。

当然这很简单,但我无法理解!

对于此事的任何帮助都会受到赞赏,例如有人在自动生成的EF模型上实现了视图模型的示例!

提前致谢, 安德鲁

2 个答案:

答案 0 :(得分:2)

如果您从EF获得People,则无法将其神奇地转换为ViewPeople。 如果实际上 <{1}},则只能将对象投射到ViewPeople

相反,您需要为ViewPeople提供一个构造函数,该构造函数需要ViewPeople并复制其属性。

答案 1 :(得分:1)

当实体框架从数据库中提取的数据返回对象时,它会创建People,而不是ViewPeople。这就解释了为什么你不能投射你的物体。如果要向People类添加功能,可以将其添加到同一程序集中的另一个文件中:

public partial class People
{
    public String someFunction() {...} // additional functionality
}

您可以做的另一件事是让ViewPeople类在其构造函数中获取People实例,包装People实例的属性(yikes!)并将您的查询更改为:

//select the person
NSDataContext dc = new NSDataContext(); // to get to the data context and models froM EF
ViewPeople person = (from p in dc.Peoples where p.id == personID select new ViewPeople(p)).First();

// pass model to view
return View(person)