微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

EF Core 5 - 多对多 - 删除

如何解决EF Core 5 - 多对多 - 删除

我使用EF Core 5的新功能,使我不必由我自己来指定多到很多类,而不是让它为EF本身做的。

我有一个简单的类:

用户地图:

public class UserMap : IEntityTypeConfiguration<User>
    {
        public void Configure(EntityTypeBuilder<User> builder)
        {
            builder.HasKey(x => x.Id);    

            builder.HasMany(x => x.Favorites).WithMany(x => x.Followers);
        }
    }


public class RecipeProviderMap : IEntityTypeConfiguration<RecipeProvider>
    {
        public void Configure(EntityTypeBuilder<RecipeProvider> builder)
        {
            builder.HasKey(x => x.Id);    

            builder.HasMany(x => x.Followers).WithMany(x => x.Favorites);
        }
    }

当然还有每个类中的集合,例如:

public ICollection<User> Followers { get; set; }
public ICollection<RecipeProvider> Favorites { get; set; }

如果我想向 RecipeProvider 类添加关注者,我会这样做:

var recipeProvider = await _dataProvider
                .RecipeProviders
                .Include(x => x.Followers)
                .FirstOrDefaultAsync(x => x.Id == request.RecipeProviderId,cancellationToken);

            if (recipeProvider == null)
                return Unit.Value;

            recipeProvider.AddAsFavorite(user);

            _dataWriter.Update(recipeProvider);
            await _dataWriter.SaveChangesAsync();

不需要添加那行必须

_dataWriter.Update(recipeProvider);

用于添加所以上面的例子中的工作,但我有问题,移除和我尝试了很多不同的选择。该提案如下所示:

 var user = await 
                _dataProvider
                    .Users
                    .Include(x => x.Favorites)
                    .FirstOrDefaultAsync(x => x.Id == request.FollowerId,cancellationToken);    

            var provider = user.Favorites.FirstOrDefault(x => x.Id == request.RecipeProviderId);

            user.Favorites.Remove(provider);
            await _dataWriter.SaveChangesAsync();

以上代码不会删除实体。我错过了什么吗?

解决方法

我用你的代码制作了一个类似的模型,但带有书籍和标签。

var tag = dbCotnext.Find<Tag>(1);
var book = dbCotnext.Find<Book>(1);

tag.Books.Add(book);
dbCotnext.SaveChanges();
tag.Books.Remove(book);
dbCotnext.SaveChanges();

我在 SaveChanges 和数据库中的所有内容都按预期放置了断点,我在点击第一个断点后看到 BookTag 表中的新实体,并在我点击第二个断点后消失。

但是,我在您的代码中看到了一些警报。您使用了两种上下文,一种用于读取 _dataProvider,另一种用于写入 _dataWriter。我认为,如果您在 SaveChanges 上调用 _dataProvider 它会起作用,但是您在 _dataWriter 上调用它,您从其他上下文加载的实体不会被跟踪。您可以将其显式加载到 _dataWriter,然后从集合中删除该元素,然后保存更改,这样 SaveChanges 就会在 _dataWriter 上按预期工作。

总而言之,我认为 _dataWriter 不会跟踪由另一个上下文 _dataProvider 加载的实体的更改。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。