如何处理EF和MVC应用程序中的继承实体?

时间:2012-09-27 09:56:43

标签: asp.net-mvc-3 entity-framework-4

我正在开发MVC应用程序并使用剃刀语法。 我使用了模型第一种方法。

我有两个实体,即客户和主管。 Lead继承自客户。

当IsActive属性为true时,Customer将被视为Lead,否则它将成为客户。

请检查edmx文件图片。

enter image description here

当我从模型生成数据库时,我得到两个表Customer Table和Customer_Lead 表。

这是客户表。

enter image description here

,这是Customer_Lead表。

enter image description here

现在的问题是当我运行引导实体的索引视图时,它会给出错误。

  

传递到字典中的模型项是类型的   PagedList.PagedList1 [CRMEntities.Customer],但这本词典   需要类型的模型项   PagedList.IPagedList1 [CRMEntities.Lead]。

我对如何为从其他实体继承的实体编写视图以及如何在使用继承实体时从这两个表中访问数据感到困惑。

索引视图代码如下......

@model PagedList.IPagedList<CRMEntities.Lead>


@{
    ViewBag.Title = "Index";
}

<h2>Index</h2>

<p>
    @Html.ActionLink("Create New", "Create")
</p>
<table>
    <tr>
        <th>
            Status
        </th>
        <th>
            IsQualified
        </th>
        <th>
            Name
        </th>
        <th>
            Address
        </th>
        <th>
            OfficePhone1
        </th>
        <th>
            Website
        </th>
        <th>
            Email2
        </th>
        <th>
            Email1
        </th>
        <th>
            FaxNo
        </th>
        <th>
            Remark
        </th>
        <th>
            Rating
        </th>
        <th>
            BusinessType
        </th>
        <th>
            IsActive
        </th>

    </tr>

@foreach (var item in Model) {
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.Status)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.IsQualified)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Name)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Address)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.OfficePhone1)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Website)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Email2)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Email1)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.FaxNo)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Remark)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Rating)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.BusinessType)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.IsActive)
        </td>

        <td>
            @Html.ActionLink("Edit", "Edit", new { id=item.Id }) |
            @Html.ActionLink("Details", "Details", new { id=item.Id }) |
            @Html.ActionLink("Delete", "Delete", new { id=item.Id })
        </td>
    </tr>
}

</table>

我在索引中有以下代码...

public ViewResult Index()
{


    var LeadList = (from c in db.Customers
                    where (c.IsActive == true)
                    orderby (c.Id)
                    select c);

   //What should I return ? 

}

1 个答案:

答案 0 :(得分:2)

您的观点看起来不错,但您正在尝试将客户列表传递给它。尝试从上下文中获取Lead客户列表。

public ActionResult Index()
{
    ...
    var leadList = db.Customers.OfType<CRMEntities.Lead>().Where(c => c.IsActive).OrderBy(c => c.Id);

    return View(leadList);
}