【发布时间】:2016-02-13 11:14:48
【问题描述】:
tl;dr:我有一些具有多对多关系的数据库。当我编辑它的数据并调用SaveChanges() 时,数据库中没有任何变化。
完整问题:
我遇到了一个非常奇怪的问题。我想更新多对多关系,但它不想改变。
我的模型看起来像这样(我只发布了对这个问题很重要的部分):
public class Note
{
public Note()
{
NoteTags = new HashSet<NoteTag>()
}
public int NoteId { get; set; }
public virtual ICollection<NoteTag> NoteTags { get; set; }
[...]
}
public class NoteTag
{
public int NoteId { get; set; }
public Note Note { get; set; }
public int TagId { get; set; }
public Tag Tag { get; set; }
}
public class Tag
{
public Tag()
{
NoteTags = new HashSet<NoteTag>();
}
public int TagId { get; set; }
public string Name { get; set; }
public virtual ICollection<NoteTag> NoteTags { get; set; }
[...]
}
我如何更新这个数据库关系:
从数据库中获取Note的当前状态:
Note noteInDb = db.Notes.Include(x => x.NoteTags).ThenInclude(x => x.Tag).AsNoTracking().FirstOrDefault(x => x.NoteId == note.NoteId);
清除List<NoteTags>并添加一个新的:
noteInDb.NoteTags = new List<NoteTag>();
noteInDb = TagsToAddToTags(note);
TagsToAddToTags 的作用:它在数据库中找到合适的Tags,并将它们添加到List<>,如下所示:
note.NoteTags.Add(new NoteTag { Tag = tagInDb });
然后我告诉数据库我修改了一些数据并保存:
db.Entry(noteInDb).State = EntityState.Modified;
db.SaveChanges();
noteInDb 变量看起来与我在将其保存到数据库时的样子完全一样。 不幸的是,没有保存任何内容,当我查看数据库时,它看起来仍然和以前一样。
奇怪的事实还在于,当我在 SaveChanges() 之后写下这一行时:
Note noteInDb2 = db.Notes.Include(x=>x.NoteTags).ThenInclude(x=>x.Tag).FirstOrDefault(x => x.NoteId == note.NoteId);
我可以看到 noteInDb2 有 9 个 NoteTags(它之前有 4 个,我希望它有 5 个,所以这实际上是之前的内容和我想要添加的内容的总和)。但是当我去 LINQPad 看看它真正的样子时,它显示了 4 个旧的 NoteTags(没有变化)。
我做错了什么?
【问题讨论】:
标签: asp.net entity-framework entity-framework-core