25

今天,我维护的项目具有非常混乱的数据库,需要大量重构并在客户端机器上发布。

我知道我可以添加一个仅包含数据库脚本的SQL Server 数据库.dacpac项目,并创建一个允许我自动更改客户端数据库的文件。

另外我知道我可以将一个.mdf文件添加App_Data到文件夹甚至Solution_Data文件夹中,然后将我的数据库放在那里。我想这localDb已经存在允许我在没有 SQL Server 的情况下启动我的解决方案

最后我知道实体框架存在于它自己的迁移中。但我不想使用它,因为我无法通过它的迁移添加和更改索引,并且当我需要描述困难的迁移场景时我没有足够的灵活性。

我的目标:

  1. 自动生成到客户端数据库的迁移脚本。
  2. 使我的解决方案自成一体,任何来到项目的新程序员甚至都不需要在他的机器上安装 SQL Server。
  3. 只需单击 1-2 次即可更新本地(开发)基础。
  4. 能够回到数据库更改的历史记录(我有 TFS 服务器)
  5. 能够在具有最新数据库方案的解决方案中拥有干净的(仅使用字典或查找表)数据库。
  6. 此外,我希望能够自动或非常简单的方式更新我的数据库模型( EF或)。.dbml

所以我要问什么:

  • 如果我想实现我的目标,使用这两种方法的优缺点是什么?

  • 可以是我应该使用这种工具的组合吗?

  • 或者我不知道 MS 的其他现有工具?

  • 有没有办法从这个数据库更新我的DAL模型?

4

2 回答 2

10

如果我想实现我的目标,使用这两种方法的优缺点是什么?

使用数据库项目允许您对所有数据库对象进行版本控制。您可以发布到各种数据库实例并逐步推出更改,而不必删除并重新创建数据库,从而保留数据。这些更改可以采用 dacpac、SQL 脚本的形式,或者直接通过 VS 界面完成。您可以使用部署前和部署后脚本以及发布配置文件对部署进行大量控制。开发人员将需要安装 SQL Server(开发人员/快速版通常足够好)。

LocalDB 使用起来更容易一些——您可以直接在数据库中进行更改,而无需发布。LocalDB 没有用于将更改推送到其他实例的内置发布流程。无需安装 SQL Server。

如果您需要对数据库对象进行版本控制,如果您有多个用户同时进行更改,或者如果您有多个使用同一数据库的应用程序,请使用数据库项目。如果这些条件都不适用或需要自己的独立数据库的小型应用程序,请使用 LocalDB。

可以是我应该使用这种工具的组合吗?

是的。根据 Kevin 在下面的评论,“如果将数据库项目设置为您的启动项目,按 F5 将自动将其部署到 LocalDB。在这种情况下,您甚至不需要发布配置文件。”

或者我不知道 MS 的其他现有工具?

Entity Framework 的 Code First方法非常接近。

有没有办法从这个数据库更新我的 DAL 模型?

Entity Framework 的 POCO 生成器运行良好,除非您对 DAL 类进行更改,否则这些更改会在您下次运行生成器时丢失。

有一个名为SqlSharpener的新工具,它可以从数据库项目中的 SQL 文件生成类。我没有使用它,所以我不能保证它,但它看起来很有希望。

于 2015-05-13T12:40:18.073 回答
1

为数据库更改生成客户端脚本的一种方法是使用像ERWin这样的数据库建模工具,它有一个免费的社区版。满足您的数据库版本控制要求和轻松生成脚本的最佳方式是Redgate SQL Source Control。使用 Redgate 工具,您将实现提到的前五个目标。此外,您现在可以根据目标 6 的要求在更改数据库架构(即数据库优先方法)后单击更新 EF 模型。

我根本不推荐使用 LocalDB。它总是在源代码控制方面出现问题,例如“DB 文件正在使用中,无法提交……”此外,项目中的开发人员将没有共同的更新数据集来处理,除非开发人员将测试数据添加到数据库并要求其他人获取最新版本并覆盖自己的数据库或通过前面提到的工具生成更新脚本并要求每个开发人员在他的 localDB 上运行它。在您的情况下,最好的方法是使用网络上的 SQL Server。主版本所有开发人员都在使用。由于您使用前面提到的工具对数据库进行了版本控制,因此您可以回滚数据库服务器中的任何错误更改。

如果您认为 RedGate 工具对于您的项目预算来说很昂贵。第二种方法是从具有所有数据库对象的数据库中生成单个 SQL 文件,其他开发人员根据他们的更改在源代码控制中更新 SQL 文件。这可以通过使用 Visual Studio 中的架构比较工具并将生成的脚本附加到源代码控制中的 SQL 文件来轻松完成。使用 EF DB First 方法,您不必像在 EF 代码中那样首先添加许多迁移类。

于 2015-05-21T05:35:27.317 回答