草庐IT

c# - 迁移者说明(FluentMigrator)?

coder 2024-06-01 原文

有人可以解释移民(特别是流移民)的概念吗?

我已经收集了关于这个主题的(可能是混淆的)事实:

  • 它是最初创建然后维护数据库更新的方法吗
    通过版本控制。
  • 的首次迁移(或
    数据库)将包含所有表,关系和属性
    必需的(流畅地执行或在脚本中使用大量的sql)。
  • 当您想将更改推送到数据库时,您将创建一个新的
    迁移方法(向上和向下),例如添加新表或修改字段。
  • 要部署这些迁移之一,您可以使用
    命令行指定包含迁移的dll,
    连接字符串和所需的版本。

  • 如果您有一组相当复杂的数据模型,那么为所有这些创建迁移定义是否相当困难且耗时?

    我知道使用nHibernate/fluent可以轻松地为数据库生成表,而无需定义除模型和映射文件以外的任何内容。有没有办法使此配置与Migrator/Versioning兼容?

    当nhibernate/fluent负责生成数据库时,我不必定义表的所有方面。它可以通过约定或通过映射文件来完成。对于迁移者,我需要定义此详细级别?

    最佳答案

    这里有很多问题。我将重点回答FluentMigrator的问题。

    Is it a way to initially create then maintain updates for a database by way of versioning.



    FluentMigrator是一种版本控制数据库模式的方法。每个人都以某种方式做到这一点。使用sql脚本,SqlCompare之类的工具或Visual Studio Database项目手动进行。所有这些方法都很容易搞砸。发行新版本时很容易出错,并导致系统崩溃。迁移是解决此问题的更好方法。

    FluentMigrator允许您将对架构的更改定义为代码,通常将其与其他代码更改一起 checkin 源代码管理中。这意味着您可以说系统的1.XX版本应该具有数据库的123版本。这意味着,如果您将代码回滚到以前的版本,那么您也知道要回滚到哪个数据库版本。

    它既可以用来从一开始就创建数据库模式,也可以从现有数据库的模式版本控制开始。

    迁移是描述数据库架构更改的一种方式。 FluentMigrator创建一个VersionInfo表,并在应用后存储“迁移”的唯一ID(版本号)。

    例如,如果我有两个迁移,其中一个迁移的ID为1,另一个迁移的ID为2。如果执行第一个迁移,则ID 1将存储在VersionInfo表中,我可以查看那里并知道数据库的版本为1并且该版本2尚未应用。

    当将更改从“测试”推送到“生产”或在“生产”中有多个数据库副本时,能够知道数据库架构的版本非常有用。例如,我有一个客户,其办事处遍布世界各地,并且每个办事处都有自己的数据库副本,并且它们都具有不同的版本。如果不知道数据库版本,则很难安全地更新它们。

    大多数时候,我不需要真正查看VersionInfo表,FluentMigrator会自动处理它。它将带有Migrations的程序集与VersionInfo表进行比较,并找出尚未应用的更改,然后执行这些更改。

    The first migration (or initial version of the database) would contain all the tables, relationships and properties required (done either fluently or using a chunk of sql in a script).



    起点取决于您。您可以进行第一个迁移,该迁移是从当前数据库生成的sql脚本。您还可以使用诸如FluentMigrator.T4之类的contrib项目之一来生成Fluent Migration。或者,您可以确定现有数据库是起点,然后保存它的副本以将其还原为版本1。

    我已经将FluentMigrator引入了很多没有任何重大问题的遗留数据库。

    When you want to push a change to a database, you would create a new migration method (Up and Down), something like add a new table or modify a field.



    是的,“向上”用于应用“迁移”中指定的更改,而“向下”将其回滚。因此,Up可以创建一个表,而Down可以删除该表。

    To deploy one of these migrations, you would use a command line specifying the dll containing the migration, the connection string and the required version.



    有三种runners可用于执行迁移。命令行运行程序,Nant任务和MSBuild任务。通常将其作为构建脚本的一部分执行。

    MigrationRunner类也可以在代码中使用。如果您想构建自己的运行程序或有其他需求(例如,动态构建数据库或在添加新迁移时自动更新数据库),则可以执行此操作。

    If you had a rather complex set of data models, wouldn't it be rather difficult and time consuming to create a migration definition for all of that?



    我已经大部分回答了。通常很容易为数据库生成一个sql脚本。对于Sql Server,即使对于大型数据库,也只需不到一分钟的时间即可生成脚本。该脚本可以保存在.sql文件中,并使用Execute.EmbeddedSqlScript表达式作为第一次迁移执行。它可以治疗。

    I know with nHibernate/fluent you can easily generate tables for a database without having to define anything other than the models and map files. Is there a way to make this configuration compatible with the Migrator/Versioning?



    目前,还没有这样的集成,至少在实践中,我不要错过它。关于连接Fluent NHibernate和FluentMigrator进行了一些讨论,但这需要大量工作。它将使脚手架能够像EF Code First迁移一样对模型进行更改。但是,目前尚不在路线图上。

    When nhibernate/fluent is in charge of generating a database, I do not necessarily need to define every thing aspect of the tables. Its done either via convention or via the mapping files. With the migrators I would need to define this level of detail?



    是的,您需要在该详细级别进行定义。 FluentMigrators的迁移是一种DSL(很少语言),用于定义转换为sql的架构更改。您也可以使用Execute.Sql表达式直接编写sql。 Entity Framework 迁移具有这样的集成,既有优点也有缺点。

    请查看wiki或教程herehere(第1部分)或here(第2部分)之一,以获得更多的入门帮助。

    关于c# - 迁移者说明(FluentMigrator)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16844030/

    有关c# - 迁移者说明(FluentMigrator)?的更多相关文章

    1. ruby-on-rails - Ruby on Rails 迁移,将表更改为 MyISAM - 2

      如何正确创建Rails迁移,以便将表更改为MySQL中的MyISAM?目前是InnoDB。运行原始执行语句会更改表,但它不会更新db/schema.rb,因此当在测试环境中重新创建表时,它会返回到InnoDB并且我的全文搜索失败。我如何着手更改/添加迁移,以便将现有表修改为MyISAM并更新schema.rb,以便我的数据库和相应的测试数据库得到相应更新? 最佳答案 我没有找到执行此操作的好方法。您可以像有人建议的那样更改您的schema.rb,然后运行:rakedb:schema:load,但是,这将覆盖您的数据。我的做法是(假设

    2. ruby - 使用 Vim Rails,您可以创建一个新的迁移文件并一次性打开它吗? - 2

      使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta

    3. c# - 如何在 ruby​​ 中调用 C# dll? - 2

      如何在ruby​​中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL

    4. C# 到 Ruby sha1 base64 编码 - 2

      我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha

    5. 基于C#实现简易绘图工具【100010177】 - 2

      C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

    6. spring.profiles.active和spring.profiles.include的使用及区别说明 - 2

      转自:spring.profiles.active和spring.profiles.include的使用及区别说明下文笔者讲述spring.profiles.active和spring.profiles.include的区别简介说明,如下所示我们都知道,在日常开发中,开发|测试|生产环境都拥有不同的配置信息如:jdbc地址、ip、端口等此时为了避免每次都修改全部信息,我们则可以采用以上的属性处理此类异常spring.profiles.active属性例:配置文件,可使用以下方式定义application-${profile}.properties开发环境配置文件:application-dev

    7. ruby-on-rails - 在现有数据库上进行 Rails 迁移 - 2

      我正在创建一个新的Rails3.1应用程序。我希望这个新应用程序重用现有数据库(由以前的Rails2应用程序创建)。我创建了新的应用程序定义模型,它重用了数据库中的一些现有数据。在开发和测试阶段,一切正常,因为它在干净的表数据库上运行,但是当尝试部署到生产环境时,我收到如下消息:PGError:ERROR:column"email"ofrelation"users"alreadyexists***[err::localhost]:ALTERTABLE"users"ADDCOLUMN"email"charactervarying(255)DEFAULT''NOTNULL但是我在迁移中有这

    8. ruby-on-rails - ActiveRecord:除非另有说明,否则在保存之前使所有文本字段都调用 strip - 2

      多年来,我在各种网站上遇到过各种问题,用户在字符串和文本字段的开头/结尾放置空格。有时这些会导致格式/布局问题,有时会导致搜索问题(即搜索顺序看起来不对,但实际上并非如此),有时它们实际上会使应用程序崩溃。我认为这会很有用,而不是像我过去所做的那样放入一堆before_save回调,向ActiveRecord添加一些功能以在保存之前自动调用任何字符串/文本字段上的.strip,除非我告诉它不是,例如do_not_strip:field_x,:field_y或类定义顶部的类似内容。在我去弄清楚如何做到这一点之前,有没有人看到更好的解决方案?明确一点,我已经知道我可以做到这一点:befor

    9. ruby-on-rails - Rails 迁移中的 PostgreSQL 点类型 - 2

      我想使用PostgreSQL中的point类型。我已经完成了:railsgmodelTestpoint:point最终的迁移是:classCreateTests当我运行时:rakedb:migrate结果是:==CreateTests:migrating====================================================--create_table(:tests)rakeaborted!Anerrorhasoccurred,thisandalllatermigrationscanceled:undefinedmethod`point'for#/hom

    10. c# - C# 中的 Flatten Ruby 方法 - 2

      我如何做Ruby方法"Flatten"RubyMethod在C#中。此方法将锯齿状数组展平为一维数组。例如:s=[1,2,3]#=>[1,2,3]t=[4,5,6,[7,8]]#=>[4,5,6,[7,8]]a=[s,t,9,10]#=>[[1,2,3],[4,5,6,[7,8]],9,10]a.flatten#=>[1,2,3,4,5,6,7,8,9,10 最佳答案 递归解决方案:IEnumerableFlatten(IEnumerablearray){foreach(variteminarray){if(itemisIEnume

    随机推荐