gpt4 book ai didi

entity-framework - Entity Framework 在多对多更新场景中附加麻烦

转载 作者:行者123 更新时间:2023-12-04 08:35:25 26 4
gpt4 key购买 nike

我有一个场景,我希望更新电影实体及其与流派的多对多关系。

导航属性 Genres电影中包含 stub Genre仅包含 GenreID 的对象因为我想保存对所有类型的数据库查询。

请参阅下面的代码,它相当自我解释。问题是我需要将我的“ stub ”流派附加到上下文中,因此 EF 只会修改 M:M 关系,而不会尝试创建新的流派记录。如果在我加载电影的当前类型时已经将类型附加到上下文,这会导致错误。它无法使用相同的键跟踪多个对象。

这应该如何处理?有没有办法检查上下文是否已经在跟踪实体,或者是否有更好的解决方案?

代码如下:

public override void Update(Movie movie)
{
//Backup new genres before clearing genres from movie
var newGenres = movie.Genres;
movie.Genres = new List<Genre>();


_ctx.Entry(movie).State = System.Data.EntityState.Modified;

//Load movie's current genres from DB and remove them
_ctx.Entry(movie).Collection(m => m.Genres).Load();
movie.Genres.Clear();

//Add new genres to movie
foreach (var genre in newGenres)
{
_ctx.Genres.Attach(genre); //Problem if genre already attached
movie.Genres.Add(genre);
}
}

谢谢你的帮助。

最佳答案

如果已经附加了具有相同 key 的实体,您可以尝试避免附加 stub :

public override void Update(Movie movie)
{
//Backup new genres before clearing genres from movie
var newGenres = movie.Genres;
movie.Genres = new List<Genre>();

_ctx.Entry(movie).State = System.Data.EntityState.Modified;

//Load movie's current genres from DB and remove them
ctx.Entry(movie).Collection(m => m.Genres).Load();
var currentGenres = movie.Genres.ToList();
movie.Genres.Clear();

//Add new genres to movie
foreach (var genre in newGenres)
{
var currentGenre = currentGenres.SingleOrDefault(g => g.Id == genre.Id);
if (currentGenre != null)
movie.Genres.Add(currentGenre);
else
{
_ctx.Genres.Attach(genre);
movie.Genres.Add(genre);
}
}
}

关于entity-framework - Entity Framework 在多对多更新场景中附加麻烦,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8522596/

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