1

作为 MVC 和实体框架的新手,我在执行复杂的数据查询时遇到了很多问题。我正在使用 Database First 方法,我需要了解从单独的数据库中提取相关数据的最佳方法。我已经连接到数据库并创建了 edmx 文件以及现有数据库中的模型。我将简化问题示例:如果我有一张包含员工信息的表:

Employee_Information(EmployeeID, FullName, Address, Phone)

然后我有第二个(在另一个数据库中)

Employee_Achievements(EmployeeID, Achievement, DateAchieved)

如何将这两者联系在一起以在视图中提取员工的信息(姓名、地址等)?我最初的想法是进行连接,然后将其传递给视图:

var employee = from emp in db.EmployeeAchievements
join empInfo in emp_db.EmployeeInformation
emp.EmployeeID == empInfo.EmployeeID

我遇到的问题是我已经在使用 ViewModel,其中有多个模型被传递给视图。我需要能够一次将多个员工的信息与视图中的类似内容联系起来:

@for (int i = 0; i < model.EmployeeAchievements.Count; i++)
{
    <tr valign="top">
        <td>
            <div class="editor-field">
                @Html.EditorFor(model => model.EmployeeAchievements[i].EmployeeID)
                @Html.ValidationMessageFor(model => model.EmployeeAchievements[i].EmployeeID)
            </div>
        </td>
// Display employee name next

可能使用 ViewBag?或者有没有办法可以跨数据库关联外键?请记住,这是数据库优先,因此会生成 edmx 和模型文件。我还没有找到我在这里尝试做的任何好的例子。我会很感激任何帮助,如果需要可以提供更多细节。

4

1 回答 1

1

您可以创建一个类,该类具有您需要的所有字段:id、姓名、成就(如果您有一对多,则为它们的列表)、日期等等 - 您需要的一切。因此,例如,这个类被命名为EmployeeAchievement. 然后,您只需将当前的 ViewModel 修改为具有List<EmployeeAchievement>名为的类型的字段EmplAch。然后,您必须构建视图模型:

YourViewModel model = new ViewModel();
model.EmplAch = (from emp in db.EmployeeAchievements
                 join empInfo in emp_db.EmployeeInformation
                 emp.EmployeeID == empInfo.EmployeeID
                 select new EmployeeAchievement 
                 {
                     EmployeeID = emp.EmployeeID,
                     AchievementId = emp.id,
                     Date = emp.DateAchieved,
                     Achievement = emp.Achievement
                 });

因此,在您看来,您可以使用:

@for (int i = 0; i < model.EmplAch.Count; i++)
{
    <tr valign="top">
        <td>
            <div class="editor-field">
                @Html.EditorFor(model => model.EmplAch[i].EmployeeID)
                @Html.ValidationMessageFor(model => model.EmplAch[i].EmployeeID)
            </div>
        </td>
// Display employee name next
}
于 2013-04-03T14:20:23.950 回答