试用EF代码优先和迁移-绊脚石

marc_s

我一直是面向数据库的程序员,所以直到今天,我一直使用数据库驱动的方法进行编程,并且我对T-SQL和SQL Server充满信心。

我正在尝试把头放在Entity Framework 6的代码优先方法上-坦率地说-我正在苦苦挣扎。

我有一个现有的数据库-所以我做了一个,Add New Item > ADO.NET Entity Data Model > Code-First from Database然后得到了一堆代表现有数据库的C#类。到目前为止,一切都很好。

我现在要尝试的是探索如何处理正在进行的数据库升级-既包括模式,也包括“静态”(预填充)查找数据。我的第一个抱怨是使用Fluent API配置了从数据库反向工程的实体,而对我来说,创建自己想创建为带有数据注释的C#类的新表似乎更为自然。“混合”这两种方法是否有任何问题?还是我可以告诉逆向工程步骤只使用数据注释属性,而不是完全使用Fluent API?

我的第二个甚至更大的抱怨:我正在尝试创建不错的迁移和较小的迁移-我要添加的每组功能(例如新表,新索引,一些新列等)每个迁移-但看来我只能进行一次“待定”迁移……当我进行一次迁移时,我进一步修改了模型类,然后尝试使用进行第二次迁移add-migration (name of migration),我受到了欢迎:

无法进行显式迁移,因为以下显式迁移正在处理中:[201510061539107_CreateTableMdsForecast]。在尝试生成新的显式迁移之前,请应用未决的显式迁移。

严重地 ?!?!?我不能有一个以上的单个挂起迁移?要添加的update-database 每个微小迁移都需要运行吗?

似乎是一个很大的缺点!我宁愿创建10个,20个小型,紧凑,易于理解的迁移,然后一口气将它们全部应用-没办法!真的很难相信.....可以解决这个问题吗?

布莱恩·罗杰斯(Brian Rogers)

的确,在开发期间一次只能打开一个待处理的迁移要了解原因,您必须了解如何生成迁移。生成器通过将数据库(架构)的当前状态与模型代码的当前状态进行比较来工作。然后,它有效地创建一个“脚本”(C#类),该脚本可更改数据库的模式以匹配该模型。您可能不想同时拥有多个挂起的脚本,否则脚本将相互冲突。让我们举一个简单的例子:

假设我有一堂课Widget

class Widget
{
    public int Id { get; set; }
    public string Name { get; set; }
}

Widgets数据库中的匹配表

Widgets
-------
Id (int, PK, not null)
Name (nvarchar(100), not null)

现在,我决定向Size班级添加一个新属性

class Widget
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int Size { get; set; }  // added
}

创建迁移时,生成器会查看我的模型,将其与数据库进行比较,然后看到我的Widget模型现在具有Size属性,而相应的表没有Size列。因此,最终的迁移看起来像这样:

public partial class AddSizeToWidget : DbMigration
{
    public override void Up()
    {
        AddColumn("dbo.Widgets", "Size", c => c.Int());
    }

    public override void Down()
    {
        DropColumn("dbo.Widgets", "Size");
    }
}

现在,假设允许在第二个迁移仍未完成时创建第二个迁移。我尚未运行Update-Database命令,因此我的基准数据库架构仍然相同。现在我决定到另一个属性添加ColorWidget

当我为此更改创建迁移时,生成器将我的模型与数据库的当前状态进行比较,并看到我添加了列。因此,它创建了相应的脚本:

public partial class AddColorToWidget : DbMigration
{
    public override void Up()
    {
        AddColumn("dbo.Widgets", "Size", c => c.Int());
        AddColumn("dbo.Widgets", "Color", c => c.Int());
    }
    ...
}

因此,现在我有两个待处理的迁移,并且它们都将Size在最终运行时尝试向数据库添加一列。显然,这是行不通的。这就是为什么一次只允许一个未决迁移被打开的原因。

因此,开发过程中的一般工作流程为:

  1. 改变你的模型
  2. 产生迁移
  3. 更新数据库以建立新的基准
  4. 重复

如果输入有误,则可以使用命令–TargetMigration参数将数据库回滚到先前的迁移Update-Database,然后从项目中删除错误的迁移并生成一个新的迁移。(如果您确实愿意,可以使用此方法将几个小的迁移组合成一个较大的块,尽管我发现在实践中这是不值得的)。

Update-Database –TargetMigration PreviousMigrationName

现在,当需要更新生产数据库时,您不必一次手动应用每个迁移。那就是迁移的美妙之处-每当您对数据库运行更新的代码时,它们都会自动应用。在初始化期间,EF会查看目标数据库并检查迁移级别(此级别存储在__MigrationHistory在数据库上启用迁移时创建的特殊表中)。对于尚未应用的代码中的任何迁移,它将全部运行它们以使您更新数据库。

希望这有助于清理问题。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

DDD和EF代码优先迁移

来自分类Dev

DDD和EF代码优先迁移

来自分类Dev

代码优先和迁移

来自分类Dev

EF代码优先迁移模型构建器

来自分类Dev

从EF自动迁移切换到代码优先迁移

来自分类Dev

使用MySQL进行EF和代码优先迁移-dbo.tablename不存在

来自分类Dev

使用 webapi 2 和 ef core 时如何在 DB 上使用代码优先迁移

来自分类Dev

实体框架代码优先迁移和 Firebird

来自分类Dev

EF代码优先迁移在Azure Web角色上引发StackOverflowException

来自分类Dev

EF代码优先迁移以部署旧版本

来自分类Dev

EF核心代码优先迁移级联删除问题

来自分类Dev

通过EF代码优先的迁移进行脱机部署

来自分类Dev

EF代码优先通用实体和EntityTypeConfiguration

来自分类Dev

存储过程以ef 6和代码优先

来自分类Dev

实体框架:多个代码优先迁移和配置种子方法

来自分类Dev

EF CascadeOnDelete代码优先

来自分类Dev

未执行代码优先迁移

来自分类Dev

EF NotMapped和JsonIgnore属性导致代码优先问题

来自分类Dev

EF逆向工程代码优先和存储过程

来自分类Dev

EF逆向工程代码优先和存储过程

来自分类Dev

自定义值类型,EF代码优先和路由

来自分类Dev

多对多和一对多 (EF) - 代码优先

来自分类Dev

部署到生产环境时,EF代码优先迁移不会播种数据

来自分类Dev

在不进行迁移的情况下优先使用EF 6.xx代码的缺点

来自分类Dev

EF6,代码优先,启用迁移,“无法加载指定的元数据资源”

来自分类Dev

可以在EF代码优先迁移种子方法中设置断点吗?

来自分类Dev

将数据库视图映射到带有迁移的EF 5.0代码优先

来自分类Dev

应用EF 6代码优先的迁移-找不到上下文类型

来自分类Dev

将数据库视图映射到带有迁移的EF 5.0代码优先

Related 相关文章

  1. 1

    DDD和EF代码优先迁移

  2. 2

    DDD和EF代码优先迁移

  3. 3

    代码优先和迁移

  4. 4

    EF代码优先迁移模型构建器

  5. 5

    从EF自动迁移切换到代码优先迁移

  6. 6

    使用MySQL进行EF和代码优先迁移-dbo.tablename不存在

  7. 7

    使用 webapi 2 和 ef core 时如何在 DB 上使用代码优先迁移

  8. 8

    实体框架代码优先迁移和 Firebird

  9. 9

    EF代码优先迁移在Azure Web角色上引发StackOverflowException

  10. 10

    EF代码优先迁移以部署旧版本

  11. 11

    EF核心代码优先迁移级联删除问题

  12. 12

    通过EF代码优先的迁移进行脱机部署

  13. 13

    EF代码优先通用实体和EntityTypeConfiguration

  14. 14

    存储过程以ef 6和代码优先

  15. 15

    实体框架:多个代码优先迁移和配置种子方法

  16. 16

    EF CascadeOnDelete代码优先

  17. 17

    未执行代码优先迁移

  18. 18

    EF NotMapped和JsonIgnore属性导致代码优先问题

  19. 19

    EF逆向工程代码优先和存储过程

  20. 20

    EF逆向工程代码优先和存储过程

  21. 21

    自定义值类型,EF代码优先和路由

  22. 22

    多对多和一对多 (EF) - 代码优先

  23. 23

    部署到生产环境时,EF代码优先迁移不会播种数据

  24. 24

    在不进行迁移的情况下优先使用EF 6.xx代码的缺点

  25. 25

    EF6,代码优先,启用迁移,“无法加载指定的元数据资源”

  26. 26

    可以在EF代码优先迁移种子方法中设置断点吗?

  27. 27

    将数据库视图映射到带有迁移的EF 5.0代码优先

  28. 28

    应用EF 6代码优先的迁移-找不到上下文类型

  29. 29

    将数据库视图映射到带有迁移的EF 5.0代码优先

热门标签

归档