我正在使用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'.
我不确定这里出了什么问题。我对流派关系进行了相同的过程,并且有效。我没有发现两者之间的区别。
答案 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?
。
在我的例子中,我得到这个是因为在我创建外键的表中有数据,这就是我收到这个错误的原因。我们知道外键可以为空。