我正在使用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模型上实现了视图模型的示例!
提前致谢, 安德鲁
答案 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)