MVC4如何在没有Navigation Properties的情况下加载相关数据

时间:2013-01-31 00:44:21

标签: asp.net-mvc-4 entity-framework-5 ef-database-first

我是一个相当新的MVC,并使用EF-database-first创建了一个MVC4应用程序。数据库不包含外键定义,我无法添加它们(我没有数据库)。以下是数据库中的两个示例类:

public partial class Allocation
{
    public int AllocID { get; set; }
    public int DeptID { get; set; }
    public decimal AllocationPercent { get; set; }
}

public partial class Department
{
    public int DeptID { get; set; }
    public string DeptName { get; set; }
    public string Account { get; set; }
}

默认的“分配索引”页面显示部门ID。我想改为显示部门名称。如何在没有导航属性的情况下执行此操作?

我试过

public class AllocationController : Controller
{
    private Entities db = new Entities();

    //
    // GET: /Allocation/

    public ActionResult Index()
    {
        return View(db.Allocation.Include(d => d.DeptID).ToList());
    }
...

但这会产生错误(“指定的包含路径无效.EntityType'TESTModel.Allocation'不会声明名为'DeptID'的导航属性。”)...

我不确定如何在没有导航属性的情况下编写预加载或显式加载的代码,这就提示了这个问题。效率方面,我认为加载相关信息的方式并不重要,因此任何方向的任何帮助都会受到赞赏。

2 个答案:

答案 0 :(得分:1)

数据库不必具有定义,只要字段在那里并且实体已经放在数据库中并考虑了参照完整性。您需要做的就是让实体框架了解这种关系。这是通过virtual关键字来创建“导航属性”。

public partial class Allocation
{
 public int AllocID { get; set; }
 public int DeptID { get; set; }
 public decimal AllocationPercent { get; set; }
 public virtual Department Department { get; set; } /* this is your nav property */
}

public partial class Department
{
 public int DeptID { get; set; }
 public string DeptName { get; set; }
 public string Account { get; set; }
}

现在你可以做到:

db.Allocation.Include(a => a.Department).ToList()

可能存在需要您使用外键定义的错误(尽管我不这么认为)。如果是这种情况,您需要像这样装饰您的导航属性

[ForeignKey("DeptID")]
public virtual Department Department { get; set; }

你也可以这样试试:

 public int AllocID { get; set; }
 [ForeignKey("Department")]
 public int DeptID { get; set; }
 public decimal AllocationPercent { get; set; }
 public virtual Department Department { get; set; }

答案 1 :(得分:0)

通过导航属性,Travis J的答案就是您所需要的。 如果您不想使用导航属性,假设您的数据库上下文有一个名为Departments的集合,您可以这样做:

var deptId = db.Allocation.DeptID;
var departments = db.Departments.Where(p => p.DeptID == deptId);
return View(departments.ToList());