C#视图模型:模型-->;Can';我无法进行打字

C#视图模型:模型-->;Can';我无法进行打字,c#,casting,viewmodel,subclass,superclass,C#,Casting,Viewmodel,Subclass,Superclass,我正在使用EF创建一个linq-to-sql模型,并且有一个运行良好的类,但是,我希望能够在使用EF进行更改时添加到该类中,而不让它们被覆盖,因此我相信我需要使用视图类的第二层 因此,我: public partial class People: INotifyPropertyChanging, INotifyPropertyChanged {...} // created by EF 然后我想做: public partial class ViewPeople: People { pu

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

因此,我:

public partial class People: INotifyPropertyChanging, INotifyPropertyChanged {...} // created by EF
然后我想做:

public partial class ViewPeople: People {
   public String someFunction() {...} // additional functionality
}
但是,当我尝试使用下面的代码从人物转换为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)
如果我只是通过person,我就可以访问所有“People”属性和方法。 当我修改ViewPeople类时,我可以在引用“this”时访问超级“People”类的所有属性和方法

当然很简单,但我就是想不出来

如有人在自动生成的EF模型上实现了viewmodels,我们将不胜感激

提前感谢,,
Andrew

如果您从EF获得
People
,则无法神奇地将其转换为
ViewPeople

如果对象实际上是
ViewPeople
,则只能将其强制转换为
ViewPeople


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

如果您从EF获得
People
,则无法神奇地将其转换为
ViewPeople

如果对象实际上是
ViewPeople
,则只能将其强制转换为
ViewPeople


相反,您需要为
ViewPeople
提供一个构造函数,该构造函数接受
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)

当实体框架从数据库中获取的数据返回对象时,它创建的是人,而不是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)

你们的类名不应该是复数。他的表是
People
,所以
People
是半正确的。这和什么有关系?我们得到ViewPeople应该是viewPerson您的类名不应该是复数。他的表是
People
,所以
People
是半正确的,这和什么有关系?我们知道ViewPeople应该是ViewPersonSeems奇怪的是,如果ViewPeople扩展了People,那么你就不能从超级角色转换为超级角色了?@Andrew:这是向后的。
ViewPeople
始终是
People
,并且可以(隐式)转换为
People
。然而,
People
不是
ViewPeople
。似乎很奇怪,如果ViewPeople扩展了People,那么你就不能从超级角色转换为次级角色了?@Andrew:这是向后的。
ViewPeople
始终是
People
,并且可以(隐式)转换为
People
。但是,
People
不是
ViewPeople
。谢谢!我不知道您可以在不同的文件中添加到分部类。这允许我在不扩展类的情况下“扩展”类,并解决了添加功能的问题,这些功能在重新自动生成时不会被覆盖!谢谢我不知道您可以在不同的文件中添加到分部类。这允许我在不扩展类的情况下“扩展”类,并解决了添加功能的问题,这些功能在重新自动生成时不会被覆盖!