Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 编码第一个实体框架,选择ViewModel-带参数的构造函数_C#_Entity Framework_Linq_Constructor - Fatal编程技术网

C# 编码第一个实体框架,选择ViewModel-带参数的构造函数

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

我创建类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? 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)看,这不是很明显吗。这也被问了很多次。我知道,但我想重写参数更容易。