实体框架迁移-alter table语句与外键约束冲突

mrwjdhj3  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(394)

我正在使用ef代码优先迁移创建一个类似于c#/.net4.5框架的博客。
事情一直进展顺利,直到在我的主课上增加了第三段恋情。
我有一个“story”类(有点像博客的“post”),其中我有一个作者作为登录的用户(设置在控制器中)、一个标题、一些内容、创建日期,以及一个故事的类型和类型。

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; }
    }

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

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'.

我不确定这里出了什么问题。我对流派关系也做了同样的处理,结果成功了。我看不出两者有什么不同。

z2acfund

z2acfund1#

因为类story中的storytypeid不接受null,所以需要使storytypeid可为null:

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之后更新数据库

相关问题