C# 编码第一个实体框架,选择ViewModel-带参数的构造函数
我创建类Employee:C# 编码第一个实体框架,选择ViewModel-带参数的构造函数,c#,entity-framework,linq,constructor,C#,Entity Framework,Linq,Constructor,我创建类Employee: public class Employees : BaseModel { [Key] public int EmployeeId { get; set; } // [ohter parameter] public int? DepartmentId { get; set; } public virtual Departments Departments { get; set; } public int? Occupatio
public class Employees : BaseModel
{
[Key]
public int EmployeeId { get; set; }
// [ohter parameter]
public int? DepartmentId { get; set; }
public virtual Departments Departments { get; set; }
public int? OccupationId { get; set; }
public virtual Occupations Occupations { get; set; }
}
我想创建一个视图模型
public class Employee_ViewModel
{
public Employee_ViewModel(Employees item)
{
this.EmployeeId = item.EmployeeId;
//[other parameter]
this.DepartmentId = item.DepartmentId;
this.OccupationId = item.OccupationId;
}
public int EmployeeId { get; set; }
//[other parameter]
public string DepartmentName { get; set; }
public string OccupationName { get; set; }
}
返回Employee_ViewModel的方法如下所示:
List<Employee_ViewModel> item = contex.Employees.Where(w => w.IsActive == true && w.IsVisible == true)
.Include(i => i.Departments)
.Include(i => i.Occupations)
.Select(s => new Employee_ViewModel(s)
{
OccupationName = s.Occupations.Name,
DepartmentName = s.Departments.Name
})
.ToList();
List item=contex.Employees.Where(w=>w.IsActive==true&&w.IsVisible==true)
.包括(i=>i.部门)
.包括(i=>i.职业)
.选择(s=>new Employee_ViewModel)
{
职业名称=s.Occupations.Name,
DepartmentName=s.Departments.Name
})
.ToList();
最后我得到一个错误:
LINQ to实体中只支持无参数构造函数和初始值设定项
此帖子的解决方案:
正在工作,但为什么我的构造函数不工作?与其他工具一样,Entity Framework在运行时创建模型的代理,这些代理作为模型的派生类发出。显然,您不能期望代理生成器使用带有参数的构造函数来实例化您的模型 总而言之:保持简单,按其使用方式使用该工具:您的实体应至少包含其无参数构造函数 考虑使用以保持简单:
// If you go for the AutoMapper approach, you need no constructor
// with parameters or factory method anymore!
List<Employee_ViewModel> item = contex.Employees.Where(w => w.IsActive == true && w.IsVisible == true)
.Include(i => i.Departments)
.Include(i => i.Occupations)
.ProjectTo<EmployeeViewModel>()
.ToList();
//如果使用自动映射方法,则不需要构造函数
//不再使用参数或工厂方法!
列表项=contex.Employees.Where(w=>w.IsActive==true&&w.IsVisible==true)
.包括(i=>i.部门)
.包括(i=>i.职业)
.ProjectTo()
.ToList();
请参阅AutoMapper的文档,以了解如何将其与实体框架相结合的更多信息。与其他工具一样,实体框架在运行时创建模型的代理,这些代理作为模型的派生类发出。显然,您不能期望代理生成器使用带有参数的构造函数来实例化您的模型 总而言之:保持简单,按其使用方式使用该工具:您的实体应至少包含其无参数构造函数 考虑使用以保持简单:
// If you go for the AutoMapper approach, you need no constructor
// with parameters or factory method anymore!
List<Employee_ViewModel> item = contex.Employees.Where(w => w.IsActive == true && w.IsVisible == true)
.Include(i => i.Departments)
.Include(i => i.Occupations)
.ProjectTo<EmployeeViewModel>()
.ToList();
//如果使用自动映射方法,则不需要构造函数
//不再使用参数或工厂方法!
列表项=contex.Employees.Where(w=>w.IsActive==true&&w.IsVisible==true)
.包括(i=>i.部门)
.包括(i=>i.职业)
.ProjectTo()
.ToList();
有关如何将其与实体框架相结合的详细信息,请参阅AutoMapper的文档。我使用的解决方案具有来自的函数,但返回错误:LINQ to Entities无法识别方法“MS.ViewModel.Employee_ViewModel From(MS.Models.Employees)”方法,并且此方法无法转换为存储表达式。性能如何,最好使用AutoMapper?在选择解决问题之前添加ToList()。但这是正确的解决方案吗?@18666我的第一次尝试是错误的。没错,表达式树应该可以翻译成SQL,而自定义工厂不可能翻译成SQL。请参阅我更新的答案,其中我扔掉了错误的部分,并且我编辑了AutoMapper方法。@18666在您尝试调用ToList并稍后选择时,这不是一个好主意,因为通常您不想让整个表在内存中进行筛选、投影等操作。可能您希望它们发生在数据库中。我使用的解决方案包含函数From,但返回错误:LINQ to Entities无法识别方法“MS.ViewModel.Employee_ViewModel From(MS.Models.Employees)”方法,并且此方法无法转换为存储表达式。性能如何,最好使用AutoMapper?在选择解决问题之前添加ToList()。但这是正确的解决方案吗?@18666我的第一次尝试是错误的。没错,表达式树应该可以翻译成SQL,而自定义工厂不可能翻译成SQL。请参阅我更新的答案,其中我扔掉了错误的部分,并且我编辑了AutoMapper方法。@18666在您尝试调用ToList并稍后选择时,这不是一个好主意,因为通常您不想让整个表在内存中进行筛选、投影等操作。可能您希望它们发生在数据库中。从异常消息(单词parameterless)看,这不是很明显吗。这也被问了很多次。我知道,但我想更容易地重写参数。从异常消息(单词parameterless)看,这不是很明显吗。这也被问了很多次。我知道,但我想重写参数更容易。