2

我是 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' 的导航属性。”)...

我也不确定如何在没有导航属性的情况下编写预先加载或显式加载的代码,这引发了这个问题。效率方面,我认为加载相关信息的方式并不重要,因此我们将不胜感激任何方向的帮助。

4

2 回答 2

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; }
于 2013-01-31T00:51:53.960 回答
0

With navigation properties, Travis J's answer is what you need. If you don't want to use navigation properties, assuming your DB context has a set called Departments, you could do smth like this:

var deptId = db.Allocation.DeptID;
var departments = db.Departments.Where(p => p.DeptID == deptId);
return View(departments.ToList());
于 2013-01-31T01:00:47.030 回答