我有一个现有的 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 中的每个表。当心,如果我改变我的数据库模型......
MyEntities
另外,我发现,如果我向 SQL Server 数据库提供有效的连接字符串,我只能实例化。由于我不想每次都真正写入我完全成熟的数据库,这阻碍了我的意图。我打算只有一些内存代理数据库。
我可以做得更简单吗?是否有一些自动化的方式来进行这种转换,比如从 DataSet 对象中生成 ObjectContext?
PS:我看到了一些关于单元测试的问题,这些问题似乎有些相关,但并不完全准确。