使用带有MySql的Entity Framework 6对多对多实体更新的密钥'PRIMARY'进行重复输入

时间:2014-12-20 09:52:51

标签: c# mysql entity-framework

为了学习ASP.NET,我决定在其中编写自己的博客。我使用的是Entity Framework 6和MySQL 5.6.21。

我有一个BlogPost实体

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异常):&#34;重复条目&#39; tag1&#39 ;关键&#39; PRIMARY&#39;&#34;。只有在&#39; tag1&#39;已经存在于数据库中(=某些博客文章中有/有此标记)。

这就是我更新BlogPost实体的方式:

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

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

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

1 个答案:

答案 0 :(得分:0)

看起来您必须逐步检查blogposttag中是否存在某些内容。

喜欢的东西 Blogposttag.firstordefault(x =&gt; x.tagname == name);

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