有人能解释一下为什么我得到这个错误吗

语句与FOREIGN KEY约束"FK_ArticleTag_Tags_ArticleId"冲突.冲突发生在数据库"Blog",表"dbo. tags",列"TagId"中

public class Article
{
    public Article()
    {
        Comments = new HashSet<Comment>();
        Tags = new HashSet<Tag>();
    }

    [Key]
    public int ArticleId { get; set; }
    public int? CategoryId { get; set; }

    [StringLength(30)]
    public string ArticleName { get; set; } = null!;
    public string? ArticleDescription { get; set; }
    public bool Visibility { get; set; }

    [ForeignKey("CategoryId")]
    [InverseProperty("Articles")]
    public virtual Category Category { get; set; }
    [InverseProperty("Article")]
    public virtual ICollection<Comment> Comments { get; set; }
    [ForeignKey("TagId")]         
    [InverseProperty("Articles")] 
    public virtual ICollection<Tag> Tags { get; set; }
}

public class Tag
{
    public Tag() 
    { 
        Articles = new HashSet<Article>();
    }

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

    [ForeignKey("ArticleId")]
    [InverseProperty("Tags")]
    public virtual ICollection<Article>? Articles { get; set; }
}

迁移后,有50篇文章和20个标签,我无法在ArticleId大于20的(自动生成的)ArticleTag表中添加新行.

我不知道这是怎么回事,有人能解释一下我做错了什么吗?

推荐答案

连接表的外部键被错误地链接—TagIdArticles.ArticleIdArticleIdTags.TagId.它也可以在错误消息或生成的迁移中看到.当然,在模型中,如果你仔细看—我不喜欢ForeignKey属性的一个原因是它的多用途和不同的含义取决于你应用它的地方,因此很容易出错.

您需要更正模型并生成/应用新的迁移:

public class Article
{    
    [ForeignKey("ArticleId")] // <-- was [ForeignKey("TagId")]
    [InverseProperty("Articles")]
    public virtual ICollection<Tag> Tags { get; set; }
}

public class Tag
{
    [ForeignKey("TagId")] // <-- was [ForeignKey("ArticleId")]
    [InverseProperty("Tags")]
    public virtual ICollection<Article> Articles { get; set; }
}

Csharp相关问答推荐

访问C#中的数据库字段时获取数据是收件箱错误-为什么?&有效,如果声明不有效

使用ElasticsearchClient设置忽略属性.默认MappingFor<>

为什么我在PuppeteerSharp中运行StealthPlugin时会出现错误?

此反射有什么问题.是否发送值转换委托?

可为空的泛型属性

Blazor在FluentButton onClick事件上设置参数

未找到任何HTTP触发器.成功部署Azure Functions Project后(c#)

未在数据流块之间传播完成

是否由DI容器自动处理由ActivatorUilties.CreateInstance()创建的服务?

为什么Docker中没有转发该端口?

Blazor Server.NET 8中的Blazore.FluentValidation问题

有条件地定义预处理器指令常量

Celler ArgumentExpression是否期望在所有情况下都捕获允许空值的运算符?

在C#ASP.NET内核中使用INT AS-1进行控制器场景的单元测试

如何在发布NuGet包之前设置命名空间?

将J数组转换为列表,只保留一个嵌套的JToken

如何使用类似于[SELECT*FROM&Q;&Q;WHERE&Q;]SQL查询的System.Data.Entity创建查询?

用MongoDB c#驱动程序删除和返回嵌套数组中的文档

工厂类是如何在.NET 8中注册的?

.NET6最小API:操作.MapGet之后的响应