重复条目..对于使用带有 MySQL 的实体框架 6 的多对多实体更新的关键“主要”

本文关键字:实体 更新 主要 框架 于使用 MySQL | 更新日期: 2023-09-27 18:34:44

为了学习 ASP.NET 我决定用它写自己的博客。我正在使用实体框架 6 和 MySQL 5.6.21。

我有一个博客文章实体

public class BlogPost
{
    public BlogPost()
    {
        Comments = new HashSet<Comment>();
        BlogPostTags = new HashSet<BlogPostTag>();
    }
    public int BlogPostId { get; set; }
    [Required]
    [StringLength(150)]
    public string Title { get; set; }
    [Required]
    [StringLength(16777215)]
    public string Content { get; set; }
    public DateTime PublishTime { get; set; }
    public DateTime UpdateTime { get; set; }
    [StringLength(500)]
    public string Summary { get; set; }
    public string Author { get; set; }

    public virtual ICollection<Comment> Comments { get; set; }
    public virtual ICollection<BlogPostTag> BlogPostTags { get; set; } 
}

与 BlogPostTag 实体具有多对多关系,如下所示

public class BlogPostTag
{
    public BlogPostTag()
    {
        BlogPosts = new HashSet<BlogPost>();
    }
    [Key]
    [StringLength(50)]
    public string TagName { get; set; }
    public ICollection<BlogPost> BlogPosts { get; set; }
    public override int GetHashCode()
    {
        return TagName.GetHashCode();
    }
}

当我尝试编辑帖子并决定向 BlogPost 实体添加一些标签时,EF6 会抛出一个异常(这只是向上传播的 MySQL 异常(:"键'PRIMARY'的重复条目'tag1'"。仅当数据库中已存在"tag1"时,才会发生这种情况(= 某些博客文章具有/具有此标记(。

这就是我更新博客帖子实体的方式:

public void EditBlogPost(BlogPost blogPost, string tags)
{
    if (!string.IsNullOrEmpty(tags))
    {
        var splitTags = tags.Split(';');
        foreach (var tag in splitTags)
        {
            blogPost.BlogPostTags.Add(new BlogPostTag() {TagName = tag});
        }
    }
    blogPost.UpdateTime = DateTime.Now;
    int bound = blogPost.Content.Length < 300 ? blogPost.Content.Length : 300;
    blogPost.Summary = blogPost.Content.Substring(0, bound) + "...";
    BlogPosts.Add(blogPost);
    SaveChanges();
}

此方法从 MVC 控制器调用 ASP.NET。 tags参数是从 POST 接收的,并且是分号分隔的字符串(例如 tag1;tag2;tag3 (。 BlogPosts声明为public DbSet<BlogPost> BlogPosts { get; set; }

有没有办法告诉 EF 首先检查数据库中是否已存在标记,如果是,请使用它而不是尝试插入新标记?

重复条目..对于使用带有 MySQL 的实体框架 6 的多对多实体更新的关键“主要”

看起来你必须以程序方式检查博客posttag中是否已经存在某些内容。

类似的东西Blogposttag.firstordefault (x => x.tagname == name(;

然后,如果该值为 null,则将其添加到博客文章标签中。如果它不为 null,那么您可以跳过 blogposttag.add(( 并在 blogpost 实体中使用该对象。