gpt4 book ai didi

c# - 在 Entity Framework 中添加具有多对多关系的项目

转载 作者:太空狗 更新时间:2023-10-29 17:38:23 25 4
gpt4 key购买 nike

当我尝试添加具有多对多关系的项时,出现主键冲突错误:

我有两个类 - 具有多对多关系的文章和标签:

public class Article
{
public int ID { get; set; }
public string Text { get; set; }
public ICollection<Tag> Tags { get; set; }
}

public class Tag
{
[Key]
public string UrlSlug { get; set; }
public string Name { get; set; }
public ICollection<Article> Articles{ get; set; }
}

当我添加新文章时,我允许用户输入任何标签,然后如果标签尚未在数据库中创建,我想创建一个新标签,或者将标签添加到文章对象的标签集合中,如果标签已经存在。

因此,当我创建新的 Article 对象时,我调用了以下函数:

public static Tag GetOrLoadTag(String tagStr)
{
string tagUrl = Tag.CreateTagUrl(tagStr);
var db = new SnippetContext();
var tagFromDb = from tagdummy in db.Tags.Include(x => x.Articles)
where tagdummy.UrlSlug == tagUrl
select tagdummy;
if (tagFromDb.FirstOrDefault() != null)
{ return tagFromDb.FirstOrDefault(); }
else
{
//create and send back a new Tag
}
}

这个函数基本上检查数据库中是否有可用的 Tag,如果有则返回该 Tag,然后使用 article.Tags.Add() 将其添加到 Article 对象的 Tag 集合中。

但是,当我尝试使用下面的代码保存它时,出现了违反主键约束错误

 db.Entry(article).State = EntityState.Modified;
db.SaveChanges();

我想不出应该如何在文章和现有标签之间建立关系。

最佳答案

在整个操作过程中使用相同的上下文实例,您的生活会轻松得多:

using (var ctx = new MyContext())
{
Article article = ctx.Articles.Single(a => a.Id == articleId);
Tag tag = ctx.Tags.SingleOrDefault(t => t.UrlSlug == tagUrl);
if (tag == null)
{
tag = new Tag() { ... }
ctx.Tags.AddObject(tag);
}

article.Tags.Add(tag);
ctx.SaveChanges();
}

如果您不想从数据库中加载文章(如果您知道该文章存在,则该查询是多余的)您可以使用:

using (var ctx = new MyContext())
{
Article article = new Article() { Id = articleId };
ctx.Articles.Attach(article);

Tag tag = ctx.Tags.SingleOrDefalut(t => t.UrlSlug == tagUrl);
if (tag == null)
{
tag = new Tag() { ... }
ctx.Tags.AddObject(tag);
}

article.Tags.Add(tag);
ctx.SaveChanges();
}

关于c# - 在 Entity Framework 中添加具有多对多关系的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6823947/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com