c# - 使用 Entity Framework 6 和 MySql 进行多对多实体更新时, key 'PRIMARY' 出现重复条目​​...

标签 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 异常):“重复条目‘tag1’用于键‘PRIMARY’”。仅当数据库中已存在“tag1”时才会发生这种情况(=某些博客文章具有此标签)。

这就是我更新 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 Controller 调用的。 tags参数是从 POST 接收的,是一个以分号分隔的字符串(例如 tag1;tag2;tag3 )。 BlogPosts声明为public DbSet<BlogPost> BlogPosts { get; set; }

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

最佳答案

看来您必须以编程方式检查 blogposttag 中是否已存在某些内容。

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

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

关于c# - 使用 Entity Framework 6 和 MySql 进行多对多实体更新时, key 'PRIMARY' 出现重复条目​​...,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27579029/

相关文章:

c# - 在 ASP.NET 4.0 中通过 Web.config 配置 NHibernate

java - 将 HttpClient 响应转换为 JsonObject 时出错

php - 表单搜索问题php

MySQL 后端和 Access(.accdb,2013)前端自动增量问题

c# - Entity Framework Core 3.1.3 在 AWS Lambda 函数和 AWS API Gateway 无服务器 API 中使用的第一个查询非常慢

asp.net-mvc - 洋葱架构 - 在哪里放置复杂的数据库查询查找

c# - Azure 应用服务后端 - 数据库优先

c# - 使用 PrincipalSearcher 查找参数为 "or"的用户

c# - EntityFramework - 实体代理错误

c# - 动态添加页脚到 ASP.NET GridView