0

我正在使用 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 模型之上实现了视图模型,我们将不胜感激。

在此先感谢,安德鲁

4

2 回答 2

2

如果您People从 EF 获得 a,则无法将其神奇地转换为ViewPeople.
只有ViewPeople当它实际上一个ViewPeople.

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

于 2011-02-28T01:46:23.313 回答
1

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

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

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

//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)
于 2011-02-28T01:48:55.220 回答