在fluentMigrator中,是否可以将列默认设置为函数?
具体来说,我将一个uniqueidentifier(Guid)列添加到已包含数据的SQL Server 2008表中,它将成为必填字段 - 是否可以将默认值设置为NewId()函数?
有人可以解释迁移者(特别是流利者)的概念吗?
以下是我在这个问题上收集到的(可能是混乱的)事实:
它是一种通过版本控制最初创建然后维护数据库更新的方法.
第一个迁移(或数据库的初始版本)将包含所需的所有表,关系和属性(流畅地完成或在脚本中使用一大块sql).
如果要将更改推送到数据库,可以创建新的迁移方法(向上和向下),例如添加新表或修改字段.
要部署其中一个迁移,您将使用命令行指定包含迁移的dll,连接字符串和所需的版本.
如果您有一组相当复杂的数据模型,那么为所有这些模型创建迁移定义会不会相当困难和耗时?
我知道使用nHibernate/fluent,您可以轻松地为数据库生成表,而无需定义除模型和映射文件之外的任何内容.有没有办法使这个配置与Migrator/Versioning兼容?
当nhibernate/fluent负责生成数据库时,我不一定需要定义表的每个方面.它通过约定或映射文件完成.有了迁移器,我需要定义这个级别的细节吗?
我目前有几个数据库使用FluentMigrator,我很想知道实体框架迁移的比较.
EF迁移可以在迁移中播种数据,并根据FluentMigrator等环境选择性地运行迁移脚本吗?
我已经在使用EF Database First作为我的应用程序的ORM了,我想我现在也读到了非Code First EF支持EF迁移的地方,但我的团队一直在考虑重构Code First方法,因为数据库优先方法的一些限制.那么EF Migrations在使用代码优先方法时,是否更有意义使用而不是拥有另一个第三方迁移框架?
.net asp.net-mvc entity-framework fluent-migrator ef-code-first
我必须遗漏一些非常基本的东西.
我正在研究一个遗留项目,我正在尝试将FluentMigrator引入混合,因为我有一些有趣的数据库更改和数据迁移,我认为使用此工具会更容易.
对于初始迁移,我只想按原样将数据库升级到当前的生产版本.为了简化初始迁移,我编写了SQL Server 2008数据库脚本,并且迁移将脚本化命令作为一系列SQL命令执行.
为了测试它,我创建了一个完全空的数据库,并尝试使用以下命令行运行它:
> migrate -a "C:\My\Project\Path\bin\debug\Rds.MyProjName.DBMigrations.dll"
-db SqlServer2008 -conn "Data Source=.\SQLEXPRESS2008;Initial Catalog=myNewDbName;
Integrated Security=SSPI" -version=20100901000000
Run Code Online (Sandbox Code Playgroud)
指定的版本是第一个迁移类的Migration属性的时间戳.
在命令行,一切似乎都运行正常 - 整个脚本缩放,结束时:
-- CreateProductionDbCircaSep2010: migrated
Run Code Online (Sandbox Code Playgroud)
但是,当我看一下数据库时,它仍然是空的.绝对没有什么在那里.My Up方法如下所示:
public override void Up()
{
var cmds = LoadEmbeddedResources
.GetEmbeddedResource("scripted_db_2010-09-01.sql")
.AsString()
.ParseCommands();
foreach (var c in cmds) {
Execute.Sql(c);
}
CreateReferenceData();
}
Run Code Online (Sandbox Code Playgroud)
(仅供参考,我正在解析脚本而不是按原样运行它,因为我开始使用Migrator.Net之前发现它已经死了,而且已经设置好了.)
任何人都可以帮我一把吗?它几乎看起来像是一个事务没有提交,或者某个命令行选项让迁移执行干运行已打开,但我看不到它......
编辑:我尝试过的其他事情
为了确认连接字符串是否正在使用我期望的数据库,我重命名了数据库,然后按预期出现了登录错误.
为了进一步测试,我减少了脚本的长度,并尝试使用它来执行它
public override void Up()
{
Execute.Script(@"..\Resources\test.sql");
}
Run Code Online (Sandbox Code Playgroud)
而不是逐个命令,但我得到相同的结果.这是该测试的输出(注意,我编辑了pathes等):
C:\My\Project\Path\FluentMigrator.Net\ >migrate -a "C:\My\Project\Path\bin\debug
\My.Project.DBMigrations.dll" -db SqlServer2008 -conn "Data Source=.\SQLEXPRESS2
008;Initial Catalog=myNewDbName;Integrated Security=SSPI" -version=2010090100000
0
Using Database …Run Code Online (Sandbox Code Playgroud) 在FluentMigrator迁移中,如果我正在定义关系,请说:
Create.Table("RelatedTable")
.WithColumn("RelatedTableId").AsGuid().PrimaryKey()
.WithColumn("MainTableId").AsGuid().NotNullable();
.WithColumn("SomeInfo").AsString().NotNullable();
Create.Table("MainTable")
.WithColumn("MainTableId").AsGuid().PrimaryKey()
.ReferencedBy("FK_RelatedTable_RelatedTableId", "RelatedTable", "MainTableId")
.WithColumn("AField").AsInt64().NotNullable()
.WithColumn("AnotherField").AsString().NotNullable();
Run Code Online (Sandbox Code Playgroud)
有没有办法在它们之间定义级联删除类型的关系?例如,如果您从MainTable中删除了某些内容,那么任何相关记录也会被删除?
我有一个带有SQL Server的以数据为中心的应用程序.它将被部署的环境不在我们的控制之下,并且没有DBA(它们都是小型企业),因此我们需要尽可能自动地分发每个应用程序/数据库更新的过程.
除了应用程序版本之间的正常变化(有时候是不可预测的),我们已经知道我们需要为每个版本分发一些新的种子数据.有时,此种子数据将与我们系统中的其他数据相关.例如:在v2-v3更新过程中,我们可能需要插入2个新行的某些主数据,在v5-v6更新过程中需要插入其他5行.
我们已经检查了Entity Framework Db Migrations(可用于自4.3.1版本以来没有Code-First的现有数据库),它以更自动和受控的方式表示传统的顺序脚本(如Fluent Migrations).
另一方面,凭借不同的理念,我们检查了SSDT及其dacpac,快照以及部署前和部署后脚本.
哪些技术/哲学更适合所描述的案例?
可以使用的任何其他技术/哲学?
还有其他建议吗?
提前致谢.
database-migration data-tier-applications fluent-migrator sql-server-2012 entity-framework-4.3
我正在尝试使用流畅的迁移器使用我的项目进行迁移.但由于缺乏文档,我正在努力弄清楚如何回滚并Down为我的迁移类调用该方法.
我使用初始版本1类设置数据库:
[Migration(1)]
public class Baseline : Migration
{
public override void Up()
{
Execute.Script("1_Baseline\\baseline.sql");
}
public override void Down() { }
}
Run Code Online (Sandbox Code Playgroud)
我正在通过包含以下内容的批处理文件运行迁移:
"....\tools\fluentmigrator\migrate.exe" - connect"Data Source =.\ sqlexpress; Initial Catalog = ekmDomains; Integrated Security = true; multipleactiveresultsets = true;" --db SqlServer2005 --target"bin\Release\EkmDomains.Migrations.dll"
这很好用.然后我写了第二个迁移类来测试它:
[Migration(2)]
public class AddNewTable : Migration
{
public override void Up()
{
Create.Table("NewTable").WithColumn("name").AsString();
}
public override void Down()
{
Delete.Table("NewTable");
}
}
Run Code Online (Sandbox Code Playgroud)
再次运行批处理文件后,一切正常.然后,我查看了流畅的迁移器工具的命令行选项,并看到了一个--version选项.我认为回滚到以前的版本我想简单地提供--version 1和Down的AddNewTable将被调用.然而,这并没有发生.控制台只显示"提交事务"方法然后关闭.但该表尚未删除,版本号未更改.
我这样做的方式是错误的,还是有人能看到我这样做的一些根本缺陷?
在我传递给的操作内部调用FluentMigrator的构建器方法Execute.WithConnection会导致抛出空引用异常.
我要做的是选择一些数据,以便我可以在c#中操作它,因为这比在T-SQL中操作它更容易,并使用我的c#操作的结果来更新数据或插入新数据(是更具体地说,我需要从存储的url字符串中选择一个查询字符串参数并将其插入其他地方).
我在迁移中选择数据的唯一方法是自己使用Execute.WithConnection和检索数据(FluentMigrator没有提供用于选择数据的帮助程序),但是如果我尝试在动作中使用任何流畅的迁移器表达式,我将传递给Execute.WithConnection空引用异常是抛出.
这是我的代码的简化版本:
[Migration(1)]
public class MyMigration : Migration
{
public void Up()
{
Execute.WithConnection(CustomDml);
}
public void CustomDml(IDbConnection conn, IDbTransaction tran)
{
var db = new NPoco.Database(conn).SetTransaction(tran); // NPoco is a micro-ORM, a fork of PetaPoco
var records = db.Fetch<Record>("-- some sql"); // this is immediately evaluated, no reader is left open
foreach (var r in records) {
var newValue = Manipulate(r.OriginalValue);
Insert.IntoTable("NewRecords").Row(new { OriginalValueId = r.Id, NewValue = newValue }); // …Run Code Online (Sandbox Code Playgroud) 目前我正在做的项目,已经从EF迁移改为Fluent Migrator。与 ef 迁移相比,Fluent Migrator 有哪些优势?是否真的值得使用 EF 迁移?
我正在使用 FluentMigrator 将一个数据库架构迁移到另一个数据库架构。我有一个案例,我想在删除它之前检查外键是否存在。
以前,我只是通过执行以下操作来删除外键:
Delete.ForeignKey("FK_TableName_FieldName").OnTable("TableName");
Run Code Online (Sandbox Code Playgroud)
如何首先检查外键是否存在?