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
Entity framework 数据传输对象和实体框架_Entity Framework_Entity - Fatal编程技术网

Entity framework 数据传输对象和实体框架

Entity framework 数据传输对象和实体框架,entity-framework,entity,Entity Framework,Entity,我正在开发一个三层web应用程序,其中我使用的是microsoft实体框架。 为了在不同层之间实现松散耦合,我使用数据传输对象在实体框架对象和自定义对象之间进行传输,但在实体框架和自定义DTO之间的转换速度方面存在问题。 我使用此方法从EF传输到DTO: 公共列表转换(列表carModelDefinition) { List cdDTOList=new List(); foreach(CarModelDefinition中的DataLayer.CarModelDefinition cmd) {

我正在开发一个三层web应用程序,其中我使用的是microsoft实体框架。 为了在不同层之间实现松散耦合,我使用数据传输对象在实体框架对象和自定义对象之间进行传输,但在实体框架和自定义DTO之间的转换速度方面存在问题。 我使用此方法从EF传输到DTO:


公共列表转换(列表carModelDefinition)
{

List cdDTOList=new List();
foreach(CarModelDefinition中的DataLayer.CarModelDefinition cmd)
{
CardDefinitionTo cdDTO=新的CardDefinitionTo();
cdDTO.CarDefinitionId=cmd.carmodeldfinitionId;
cdDTO.Compagny=cmd.Company;
cdDTO.Model=cmd.Model;
cdDTOList.Add(cdDTO);
}
返回cdDTOList;
}

但是,当我尝试传输一个包含600个元素的列表时,我需要10秒以上的时间。是我做错了什么,还是速度这么慢?
注意。我在一台速度非常快的电脑上工作,所以不是我的电脑的速度减慢了速度。

你发布的代码不仅仅是在EF类型和DTO类型之间转换,你还从数据库中获取数据。为便于测量,尝试将两者分开。很可能是数据检索需要10秒,而不是在内存中移动数据所花费的时间。

我通过以下方式加载它:

        public List<CarDefinitionDTO> LoadAll()
    {
        List<DataLayer.CarModelDefinition> carList = (from cd in mee.CarModelDefinition select cd).ToList();
        CarDefinitionDTO cdDTO = new CarDefinitionDTO();
        List<CarDefinitionDTO> carDefList = cdDTO.Transform(carList);
        return carDefList;
    }
public List LoadAll()
{
List carList=(从mee.CarModelDefinition中的cd中选择cd.ToList();
CardDefinitionTo cdDTO=新的CardDefinitionTo();
List carDefList=cdDTO.Transform(carList);
返回卡片列表;
}

我发现了错误。在构造函数中,我创建了实体管理器的实例,当我创建一个新对象时,它会一直创建一个新实例,这相当耗时。

DRY! 尝试使用DTO/汇编生成器,如。它从实体框架EDMX文件生成DTO和汇编程序。 这样,您就不必对每个实体/DTO映射进行编码,汇编器将向您的实体和生成的DTO添加扩展方法,因此您最终可以这样编码:

var myCar = new Car();
CarDTO dto = myCar.ToDTO();
myCar = dto.ToEntity();
或:

ICollection carCol=new List();
ICollection carDTOs=carCol.ToDTOs();
carCol=carDTOs.toenties();

非常简单,而且该工具非常易于使用。

您可以尝试
zip
unzip
二进制格式的数据(压缩和解压缩)


我看不出在该功能中我在哪里与数据库交互?我只是从一个列表中创建了一个新的列表,这个列表是参数?我可能读错了。为什么传递并返回“List”而不是List和List?方法调用的实际参数是什么?你确定它只是一个列表而不是一个IQueryable吗?我不知道你是否在顶部看到了func定义(public list Transform(list carModelDefinition))。我返回一个DTO而不是Datalayer.Carmodeldefinition,因为在UI中,我不希望数据层和UI之间有任何耦合,因此我使用DTO的s.DTO-good。“列表”而不是“列表”-这就是我要问的。代码本身没有任何东西是慢的。唯一的机会是,如果你用慢动作来称呼它。这就是为什么我想知道你怎么称呼这个方法,因为你没有使用列表。既然你已经发现并解决了这个问题,那么你最好更新这个问题,以便将来的读者可以学习——或者至少不会被误导。
var myCar = new Car();
CarDTO dto = myCar.ToDTO();
myCar = dto.ToEntity();
ICollection<Car> carCol = new List<Car>();
ICollection<CarDTO> carDTOs = carCol.ToDTOs();
carCol = carDTOs.ToEntities();