假设我们有一个像这样的ASP.NET MVC视图:
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<dynamic>" %>
<%: Html.EditorFor(model => model.ServiceDate) %>
<%: Html.ValidationMessageFor(model => model.ServiceDate, "*")%>
我们有类似但不完全相同的Model类,例如Invoice
和Quote
,它们都包含ServiceDate
属性。这两个类不是从同一个基类继承的,实际上它们目前没有基类。
当EF生成这两个基类时,如何让它们从同一个基类继承?如果我能够这样做,我可以替换dynamic
并将基类指定为View的强类型。
我的印象是dynamic
就是为此而建的。但显然它不起作用,因为有一个例外显然是从LINQ到EF:
CS1963:表达式树可能不包含动态操作
虽然它确实在VS 2010编辑器中说表达式将在运行时解析,但它不是,但是错误失败。
答案 0 :(得分:1)
1)Entity Framework生成的类使用partial
关键字。这意味着您可以轻松扩展它们,而不必担心代码生成会消除您的更改。
让我们说EF生成:public partial class Customer
你可以做的是定义另一个名为Customer_Partial.cs的.cs文件(只是我个人的命名偏好),然后执行以下操作:
public partial class Customer : IMySharedInterface
{
}
然后您的视图页面使用:
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<IMySharedInterface>" %>
然后以强类型方式访问您的模型属性。
2)我认为这是由您将IQueryable传递到视图中引起的。不过不确定。有了上述解决方案,您就不必担心了。
答案 1 :(得分:0)
您似乎正在尝试在视图中使用EF生成的类。我建议你不这样做。这就是ViewModels应该做的事情。不要害怕为每个视图创建视图模型(即使您必须重复某些属性)并避免传递模型。同时拥有强烈键入<dynamic>
的视图就好像您有弱类型的视图一样。再一次:避免它们:
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<SomeAdaptedViewModel>" %>
<%: Html.EditorFor(model => model.ServiceDate) %>
<%: Html.ValidationMessageFor(model => model.ServiceDate, "*")%>
答案 2 :(得分:0)
首先,您使用的是哪个EF版本? 我想你使用的是EFv1,对吧?您可以为来自EF的模型添加继承。它们都被框架定义为parcial类。这意味着您可以创建另一个具有从基类继承的相同名称(也是parcial)的类。
顺便说一句,我建议你在这种情况下使用ViewModels。避免使用继承只是为了重用某些属性,应该使用继承来为类添加多态行为。