EntityFramework——更新多对多关系

本文关键字:关系 更新 EntityFramework | 更新日期: 2023-09-27 18:15:11

我正在尝试更新一个多对多关系。我有两个模型,日记本和标签。模型日记包含一个标签列表,标签包含一个日记列表。但是,每当我尝试向现有列表添加另一个标签或更改现有列表时,都会抛出一个异常:

实体类型List ' 1不是当前上下文模型的一部分。

我的更新方式对集合有效吗?或者我该考虑其他方法吗?

日记模型
public class Diary
{
    [Key]
    public int IdDiary { get; set; }
    [Required(ErrorMessage = "This field is required")]
    public string NameDiary { get; set; }
    [Required(ErrorMessage = "This field is required")]
    [DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}")]
    public DateTime CreationDate { get; set; }
    public bool Locked { get; set; }
    public ICollection<Entry> Entries { get; set; }
    [DataType(DataType.MultilineText)]
    [Required(ErrorMessage = "This field is required")]
    public string Summary { get; set; }
    public string ImageUrl { get; set; }
    public ICollection<Tag> Tags { get; set; }
}

输入模型

public class Entry
{
    [Key]
    public int IdEntry { get; set; }
    [DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}")]
    public DateTime CreationDate { get; set; }
    [DataType(DataType.MultilineText)]
    public string EntryText { get; set; }
    [ForeignKey("Diary_IdDiary")]
    public Diary Diary { get; set; }
    public int Diary_IdDiary { get; set; }
    public string EntryName { get; set; }
}

标记模型

public class Tag
{
    [Key]
    public int Id { get; set; }
    public string Name { get; set; }
    public ICollection<Diary> Diaries { get; set; }
}

更新方法
    public void UpdateDiary(Diary updatedDiary)
    {
        var searchResult = SearchDiary(updatedDiary);
        if (searchResult != null)
        {
            updatedDiary.IdDiary = searchResult.IdDiary;
            _context.Entry(searchResult).CurrentValues.SetValues(updatedDiary);
            _context.Entry(searchResult.Tags).CurrentValues.SetValues(updatedDiary.Tags);
            _context.SaveChanges();
        }
    }

SearchDiary方法
    public Diary SearchDiary(Diary searchDiary)
    {
        var queryResult =
            _context.Diaries.Include(d => d.Entries).Include(d => d.Tags)
                .Where(d => (d.NameDiary == searchDiary.NameDiary && d.CreationDate == searchDiary.CreationDate) || d.IdDiary == searchDiary.IdDiary);
        return queryResult.FirstOrDefault();
    }

感谢您的阅读

EntityFramework——更新多对多关系

有一种方法:

DiaryModel

public class Diary
{
    [Key]
    public int IdDiary { get; set; }
    [Required(ErrorMessage = "This field is required")]
    public string NameDiary { get; set; }
    [Required(ErrorMessage = "This field is required")]
    [DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}")]
    public DateTime CreationDate { get; set; }
    public bool Locked { get; set; }
    public virtual ICollection<Entry> Entries { get; set; }
    [DataType(DataType.MultilineText)]
    [Required(ErrorMessage = "This field is required")]
    public string Summary { get; set; }
    public string ImageUrl { get; set; }
    public ICollection<Tag> Tags { get; set; }
}

EntryModel

public class Entry
{
    [Key]
    public int IdEntry { get; set; }
    [DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}")]
    public DateTime CreationDate { get; set; }
    [DataType(DataType.MultilineText)]
    public string EntryText { get; set; }
    [ForeignKey("Diary_IdDiary")]
    public virtual Diary Diary { get; set; }
    public int Diary_IdDiary { get; set; }
    public string EntryName { get; set; }
}

搜索

public Diary SearchDiary(int DiaryId)
{
    return _context.Diaries
        .Include(p => p.Entries)
        .Include(p => p.Tags)
        .FirstOrDefault(p => p.IdDiary == DiaryId);
}
为更新

public void UpdateDiary(Diary Diary)
{
    _context.Update(Diary);
    _context.SaveChanges();
}

应该将修改后的Diary对象传递给更新函数