繁体   English   中英

如何动态地将DataSet对象转换为ObjectContext(Entity Framework)对象?

[英]How to convert a DataSet object into an ObjectContext (Entity Framework) object on the fly?

我有一个现有的SQL Server数据库,我存储来自大型特定日志文件(通常为100 MB或更多)的数据,每个数据库一个。 经过一些分析后,数据库将再次被删除。

从数据库中,我通过Visual Studio设计器创建了实体框架模型和数据集模型。 在一个非常复杂的解析过程之后,DataSet仅用于使用SqlBulkCopy批量导入数据。 然后使用实体框架模型完成所有查询,其CreateQuery方法通过这样的接口公开

    public IQueryable<TTarget> GetResults<TTarget>() where TTarget : EntityObject, new()
    {
        return this.Context.CreateQuery<TTarget>(typeof(TTarget).Name);
    }

现在,有时我的文件非常小,在这种情况下我想省略导入到数据库中,但只是有一个内存中的数据表示,可以作为实体访问。 我们的想法是创建DataSet,而不是批量导入,直接将其转换为可通过接口访问的ObjectContext。

这有意义吗?

现在这就是我到目前为止为此转换所做的事情:我遍历DataSet中的所有表,将单行转换为相应类型的实体,并将它们添加到我键入的Entity上下文类的实例化对象中,就像这样

            MyEntities context = new MyEntities(); //create new in-memory context
            ///....
            //get the item in the navigations table
            MyDataSet.NavigationResultRow dataRow = ds.NavigationResult.First(); //here, a foreach would be necessary in a true-world scenario
            NavigationResult entity = new NavigationResult
            {
                Direction = dataRow.Direction,
                ///...
                NavigationResultID = dataRow.NavigationResultID
            }; //convert to entities

            context.AddToNavigationResult(entity); //add to entities
            ///....

这是一项非常繁琐的工作,因为我需要为每个实体类型创建一个转换器,并迭代我在DataSet中的每个表。 请注意,如果我更改了我的数据库模型....

另外,我发现,如果我向SQL Server数据库提供有效的连接字符串,我只能实例化MyEntities 由于我不想每次都写入我的完全成熟的数据库,这阻碍了我的意图。 我打算只有一些内存代理数据库。

我可以做得更简单吗? 是否有一些自动执行此类转换的方法,例如从DataSet对象生成ObjectContext?

PS:我已经看到一些关于单元测试的问题似乎有点相关,但并不完全准确。

有些工具可以在对象之间进行映射,例如automapper 这是一个非常好的开源工具。

然而,这些工具有时会出现问题,例如,当被映射的对象的结构非常不同时,生成重复的实体密钥或问题。

如果您尝试自动化它,我认为如果您使用EF 4和POCO对象,它有更大的可能性。

如果您最终手动编写映射代码,我会将其移动到单独的过程中,并对其进行自动单元测试。

我们这样做的方法是使用“Map”方法创建一个静态类“:

  • 从DTO到EF对象
  • 从EF到DTO

然后为我们检查字段是否正确映射的每种方法编写测试。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM