EF 4.1 Code First - 使用[Required]属性更新模型

时间:2012-02-10 08:42:14

标签: .net entity-framework ef-code-first

我以前的模型没有任何DataNotations,但我最近改变了这一点,对某些属性应用[Required]。发生这种情况时,我的迁移代码开始抛出异常,例如:

  

无法应用挂起的更改,因为自动迁移是   禁用。要启用自动迁移,请确保   DbMigrationsConfiguration.AutomaticMigrationsEnabled设置为true。

我认为必须完成一些明确的迁移操作。请澄清。

编辑:对于我来说,AutomaticMigrationsEnabled = true不是我的选项,我很有兴趣如何通过一些迁移脚本实现这一点。

3 个答案:

答案 0 :(得分:2)

添加一个扩展DbMigrationsConfiguration的Configuration类并将AutomaticMigrationsEnabled设置为true,示例类看起来像这样

namespace yournamespace
{
    using System;
    using System.Data.Entity;
    using System.Data.Entity.Migrations;
    using System.Linq;

        internal sealed class Configuration : DbMigrationsConfiguration<YourDbContext>
        {
            public Configuration()
            {
                AutomaticMigrationsEnabled = true;
                AutomaticMigrationDataLossAllowed = true;
            }


        }
    }

然后将配置类添加到DbMigrator实例,如下所示

namespace yournamespace
{
    public class YourDataMigrator
    {
        public void MigrateData()
        {
            DbMigrationsConfiguration configuration=new Configuration();
            DbMigrator dbMigrator = new DbMigrator(configuration);

            try
            {
                dbMigrator.Update();
            }
            catch (Exception ex)
            {
                throw ex;
            }

        }
    }

}

我认为这可以解决您的问题

答案 1 :(得分:1)

您可以通过执行以下脚本在程序包管理器控制台中创建迁移脚本:

PM> Enable-Migrations 

接着是

PM> Add-Migration Initial

接着是

PM>  Update-Database

最初在此处找到:http://www.snippetsource.net/Snippet/146/enable-automatic-migrations-in-ef-codefirst-c

答案 2 :(得分:0)

不确定我是否在同一页上,但我认为这就是你所要求的。我将AutomaticMigrations设置为false:

public Configuration()
{
        AutomaticMigrationsEnabled = false;
}

我有一个像这样的Post类:

public class Post
{
    public int Id { get; set; }
    public string Title { get; set; }
    [Required]
    public DateTime DateCreated { get; set; }
    public string Content { get; set; }
    public string Tags { get; set; }
    public ICollection<Comment> Comments { get; set; }
}

它已经生成了,但后来由于某种原因我意识到我需要标题。

public class Post
{
    public int Id { get; set; }
    [Required]
    public string Title { get; set; }
    [Required]
    public DateTime DateCreated { get; set; }
    public string Content { get; set; }
    public string Tags { get; set; }
    public ICollection<Comment> Comments { get; set; }
}

我进行了更改,快速构建,然后从PM控制台输入:

添加迁移AddPostAnnotation(名称可以是您想要的任何内容)

生成此文件:

public partial class AddPostAnnotations : DbMigration
{
    public override void Up()
    {
        AlterColumn("dbo.Posts", "Title", c => c.String(nullable: false));
    }

    public override void Down()
    {
        AlterColumn("dbo.Posts", "Title", c => c.String());
    }
}

一旦到达此处,我只需从PM控制台运行Update-Database,即可发送更改。