实体框架迁移-与外键约束冲突的Alter表语句

时间:2018-07-25 19:48:50

标签: c# mysql asp.net-mvc entity-framework

我正在使用EF代码优先迁移的C#/。NET 4.5框架创建各种博客。

在我的主要班级中增加第三个关系之前,情况一直很好。

我有一个“故事”类(有点像博客的“帖子”),其中有作者作为登录用户(在控制器中设置)作为作者,标题,一些内容,日期以及故事的类型和类型。

public class Story
    {
        public int Id { get; set; }

        public string AuthorId { get; set; }
        public virtual ApplicationUser Author { get; set; }

        [Required]
        [StringLength(50)]
        public string Title { get; set; }

        [Required]
        [MinLength(100), MaxLength(5000)]
        public string Content { get; set; }

        [Required]
        public int GenreId { get; set; }
        public Genre Genre { get; set; }

        [Required]
        public int StoryTypeId { get; set; }
        public StoryType StoryType { get; set; }

        public DateTime CreatedAt { get; set; }
    }

我将故事类型添加为故事的属性。 StoryType链接到StoryType模型:

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

我确保将dbset添加到我的应用程序数据库上下文中:

public DbSet<Genre> Genres { get; set; }
public DbSet<Story> Stories { get; set; }
public DbSet<StoryType> StoryTypes { get; set; }

我几乎遵循了用于创建故事和体裁之间关系的相同步骤(效果很好)。在开始构建StoryType控制器之前,我进入了package-console并运行:

add-migration
返回的

 public partial class CreateTypeTable : DbMigration
    {
        public override void Up()
        {
            CreateTable(
                "dbo.StoryTypes",
                c => new
                    {
                        Id = c.Int(nullable: false, identity: true),
                        Name = c.String(),
                    })
                .PrimaryKey(t => t.Id);

            AddColumn("dbo.Stories", "StoryTypeId", c => c.Int(nullable: false));
            CreateIndex("dbo.Stories", "StoryTypeId");
            AddForeignKey("dbo.Stories", "StoryTypeId", "dbo.StoryTypes", "Id", cascadeDelete: true);
        }

        public override void Down()
        {
            DropForeignKey("dbo.Stories", "StoryTypeId", "dbo.StoryTypes");
            DropIndex("dbo.Stories", new[] { "StoryTypeId" });
            DropColumn("dbo.Stories", "StoryTypeId");
            DropTable("dbo.StoryTypes");
        }
    }

浏览了一下,没有发现问题,然后运行:

update-database

在控制台中。

哪个返回:

Error Number:547,State:0,Class:16
The ALTER TABLE statement conflicted with the FOREIGN KEY constraint "FK_dbo.Stories_dbo.StoryTypes_StoryTypeId". The conflict occurred in database "aspnet-HiRatik.Stories-20180724043630", table "dbo.StoryTypes", column 'Id'.

我不确定这里出了什么问题。我对流派关系进行了相同的过程,并且有效。我没有发现两者之间的区别。

2 个答案:

答案 0 :(得分:1)

因为在Story类中的StoryTypeId不接受null,所以您需要将StoryTypeId设置为可空:

public class Story
    {
        public int Id { get; set; }

        public string AuthorId { get; set; }
        public virtual ApplicationUser Author { get; set; }

        [Required]
        [StringLength(50)]
        public string Title { get; set; }

        [Required]
        [MinLength(100), MaxLength(5000)]
        public string Content { get; set; }

        [Required]
        public int GenreId { get; set; }
        public Genre Genre { get; set; }

        public int? StoryTypeId { get; set; }
        public StoryType StoryType { get; set; }

        public DateTime CreatedAt { get; set; }
    }

或者您首先创建表StoryType,然后向其中添加元素,然后添加具有默认值的StoryTypeId:

公共课的故事     {         public int ID {get;组; }

    public string AuthorId { get; set; }
    public virtual ApplicationUser Author { get; set; }

    [Required]
    [StringLength(50)]
    public string Title { get; set; }

    [Required]
    [MinLength(100), MaxLength(5000)]
    public string Content { get; set; }

    [Required]
    public int GenreId { get; set; }
    public Genre Genre { get; set; }

    [[DefaultValue(1)]]
    public int StoryTypeId { get; set; }
    public StoryType StoryType { get; set; }

    public DateTime CreatedAt { get; set; }
}

在这种情况下,您必须在创建StoryType之后并将StoryTypeId添加到Story类中之后更新数据库

答案 1 :(得分:0)

您可以使用符号 ? 使外键可以为空,如下所示:int?

在我的例子中,我得到这个是因为在我创建外键的表中有数据,这就是我收到这个错误的原因。我们知道外键可以为空。