2

介绍:

在我目前的实习中,我正在重构(几乎重写)一个遗留应用程序。这个问题将关注的部分是它使用的数据库以及他们从中检索数据的方式。

数据库结构为:

  1. 有一个包含主要记录的表。假设每条记录都是一个测量值。它有一些关于被测材料和不同测量信息的信息。
  2. 他们使用的表格视图具有相同的信息列,以及一些包含根据给定测量计算的数据的额外列。它还过滤了表中的一些数据。

因此,假设我们有带有列的主表:

Measurement ID
Measurement A
Measurement B

该视图具有以下内容:

Measurement ID
Measurement A
Measurement B
Some extra data (for example Measurement A * Measurement B)

领导开发的人只会一些 SQL,所以他喜欢在主表中添加由某些列计算的新列来进行实验。这绝对是目前的需要

要求是:

  1. 应支持不同类型的数据库(如 SQL Server、Oracle 和可能的其他一些数据库)。
  2. 前端应该能够显示视图,这意味着即使某些主列始终保持不变,也可能会有一些新列包括新计算的值。

我的问题是:

我应该使用什么样的系统来满足这个应用程序的需求?我想使用实体框架,但是视图将来可能有新列的事实我认为是一个问题。据我了解,我应该在编译之前将我的类映射到数据库。

我正在考虑的另一件事可能是使用实体框架从主表中获取数据,并直接在前端直接在表视图中进行当前完成的计算和过滤,并完全跳过视图。听起来不错,但我不知道他们是否会允许我这样做。

在我的情况下你会怎么做?请考虑到我几乎没有使用数据库和 ORM 的经验。

4

5 回答 5

1

你是对的,如果底层数据库模式总是在变化,那么使用实体框架将是一个问题。每次都需要您更新 EF 模型以获取这些新列。

理想情况下,您的所有数据库访问都隐藏在 DAL 的接口后面,因此您的应用程序不需要知道正在使用哪个 ORM(如果有)或它正在连接到哪个数据库。

我不想这么说,但考虑到您的要求,ORM 可能没有意义。您可能想要使用更通用的东西而不需要任何强类型。您可以简单地始终将 DataTable 返回到您的应用程序层,它可以循环遍历列和值以显示返回的任何内容。如果您知道某些字段永远不会更改,您可以将这些字段手动映射到您的应用程序对象中。

于 2013-04-11T20:56:08.670 回答
1

你可以看看NoSQL系统,它在模式上更加灵活。或者看看像RavenDB这样的文档数据库。所有这些系统都允许模式动态改变。您需要检查 Pro's 和 Con's 以查看它是否可以满足您的要求。

(这个答案有点超出主题,因为它是关于替换 SQL 服务器而不是真正创建 DAL,但其他答案很好地涵盖了这个主题,我想提出另一种可能有帮助的方法。)

于 2013-04-11T23:44:13.507 回答
0

如果您的架构不稳定,那么初学者使用 Entity Framework 会很头疼。假设您可以定期刷新设计画布以让工具处理数据库表更改。您可以尝试一段时间,看看它何时变得太痛苦,但如果没有任何使用 ORM 或实体框架的经验,可能不值得付出努力。

我可能会使用类似 Rob Conery 的 Massive ORM ( https://github.com/robconery/massive ) 之类的东西。它为您提供了更多使用底层数据库模式的灵活性,并且是一个非常小的库。我记得它大约有 300 行代码,而且非常易于使用。它使用 C# 动态,因此您必须使用 >= C# 4.0 并且对这一概念感到满意,但 IMO 对低开销来说是值得的。像 Entity Framework 或 NHibernate 这样成熟的 ORM 将花费大量的学习周期。

当然,您可以只使用 ADO.NET DataTables。它们有点丑陋和冗长,但它们会完成这项工作。

于 2013-04-11T21:17:45.167 回答
0

如果数据库正在更改,您可以使用实体框架 - 数据库优先。当然,当您希望能够访问新列时,当数据库架构发生变化时,您将不得不重新生成您的类。

如果您需要容纳不同的数据库服务器,那么您应该考虑实现存储库模式并以这种方式抽象您的所有数据访问。

于 2013-04-11T21:18:04.140 回答
0

你的评论

它涉及对主表的写操作,但主表永远不会改变

证实了我的期望。这意味着您可以使用实体框架作为应用程序的核心,并使用不同的路径来显示数据。

假设您使用经典的(视图的)显示DataTable(因为所有常见的网格都支持它们,与显示动态对象相反)。我不知道如何创建/更新/删除,但保存更改有时会涉及将 a 映射DataRowMainEntity对象。您可以为此编写一种方法

MainEntity DataRowToEntity(DataRow row)
{
    var entity = new MainEntity();
    entity.PropertyA = row["PropertyA"];
    ....
}

MainEntity可以附加到上下文,其状态更改为并Modified保存。

于 2013-04-11T22:47:06.497 回答