将导航属性的结果分配给视图模型

时间:2017-08-05 15:25:58

标签: c# entity-framework viewmodel code-first

这是我的数据库架构: -

public class Department
{
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual ICollection<Employee> Employee_Id { get; set; }
}

public class Employee
{
    public int Id { get; set; }
    public string Name { get; set; }
    public long Salary { get; set; }
    public string Gender { get; set; }
    public virtual Department Department_Id { get; set; }
}

根据我的研究,使用查看模型是一个很好的做法,所以我通常使用这种查询创建我的模型: -

var v = edm.Departments.Select(x => new departmentViewModel { Name = x.Name });
return v.ToList();

现在我想将导航属性的好处添加到我的代码中。如果我不能将结果分配给我的查看模型,问题对我没用。如果我尝试通过员工访问部门,则无法访问 .Select()语句。

var v = edm.Employees.Where(x => x.Id == 1).FirstOrDefault().Department_Id. //Ops!!!

在上述声明中,我可以访问IdName,但.Select()无法访问。

我可以忽略导航属性并将我的查询分成两个查询并实现我想要的效果。但我问我如何通过导航属性来实现这一目标?我只是误解了它的用法吗?

1 个答案:

答案 0 :(得分:0)

我发现实际上在我的架构中没有导航属性。要拥有导航属性,您的类中必须有构造函数,而 ForeignKey 才能引用该构造函数。

public class Department
{
    public Department(){} //needed constructor

    public int Id { get; set; }
    public string Name { get; set; }

    [ForeignKey("Employee")]
    public int Employee_Id;
    public virtual ICollection<Employee> Employee { get; set; }
}

public class Employee
{
    public Employee(){} //needed constructor

    public int Id { get; set; }
    public string Name { get; set; }
    public long Salary { get; set; }
    public string Gender { get; set; }

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

现在我可以通过标准方式通过 Employee 访问部门,但 .Select()语句仍然无法访问。这并不重要,我发现我可以在没有 .Select()语句的情况下将结果复制到下一行的查看模型中。

var e = edm.Employees.Where(x => x.Id == 1).FirstOrDefault().Department; //.select() is still inaccessible
departmentViewModel department = new departmentViewModel() { Id = e.Id, Name = e.Name };//but I could copy the result into my View Model here