为了学习 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/