【问题标题】:How to convert a DataSet object into an ObjectContext (Entity Framework) object on the fly?如何即时将 DataSet 对象转换为 ObjectContext(实体框架)对象?
【发布时间】:2010-04-22 14:49:34
【问题描述】:

我有一个现有的 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?

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

【问题讨论】:

  • 我正在寻找类似的东西我想知道您是否找到了一个简单的解决方案?我发现这通常可以在线转换为实体,尽管我需要装饰我的实体(如果字段不匹配)..exceptionnotfound.net/…我还没有为我的目的测试它

标签: c# entity-framework dataset objectcontext


【解决方案1】:

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

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

如果您尝试将其自动化,我认为如果您使用 EF 4 和 POCO 对象,它的工作机会更大。

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

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

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

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

【讨论】:

  • Automapper 看起来很棒。 EF4 也很棒,但是由于这个项目已经非常成熟,并且基于 3.5 的需求,目前还没有这个选项。您所说的“单独程序”是什么意思?你的意思是“组装”吗?我也认为单元测试非常方便,但我到底应该测试什么?映射是否完整?或者模型是否改变了?但是,最后,我要感谢您到目前为止的回答!
  • 感谢 Shiraz 回答了这个问题。由于没有其他人回复,并且您提到的 Automapper 是解决此类问题的好方法,因此您当然会收到赏金。
猜你喜欢
  • 1970-01-01
  • 2012-10-25
  • 2012-08-14
  • 1970-01-01
  • 1970-01-01
  • 2022-07-28
  • 1970-01-01
  • 2016-12-19
  • 2016-12-26
相关资源
最近更新 更多