C# EF核心5-多对多-移除

C# EF核心5-多对多-移除,c#,many-to-many,entity-framework-core-5.0,C#,Many To Many,Entity Framework Core 5.0,我正在使用EF Core 5的新功能,我不必自己指定多对多类,而是让它为EF本身指定 我有一个简单的课程: 用户地图: public class UserMap : IEntityTypeConfiguration<User> { public void Configure(EntityTypeBuilder<User> builder) { builder.HasKey(x => x.Id);

我正在使用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);
        }
    }
不是说要添加行

_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();
var tag=dbCotnext.Find(1);
var book=dbCotnext.Find(1);
tag.Books.Add(book);
dbCotnext.SaveChanges();
标记。书本。删除(书本);
dbCotnext.SaveChanges();
我在SaveChanges之后放置了断点,数据库中的所有内容看起来都与预期的一样,在命中第一个断点后,我在BookTag表中看到了新实体,在命中第二个断点后它消失了

但是,我在代码中看到一些提示。您使用的是两个上下文,一个用于读取
\u数据提供程序
,另一个用于写入
\u数据编写器
。我认为,如果您在
\u dataProvider
上调用
SaveChanges
,它会起作用,但在
\u dataWriter
上调用它时,您从其他上下文加载的实体不会被跟踪。您可以显式地将它加载到
\u dataWriter
,然后从集合中删除元素,然后保存更改,这样
保存更改
就可以在
\u dataWriter
上按预期工作


总之,我认为
\u dataWriter
没有跟踪另一个上下文加载的实体上的更改,该上下文是
\u dataProvider

,谢谢您的时间!我现在检查的是在解析时检查construcotr中的hascodes,我看到的响应是:var writerCode=dataWriter.GetHashCode();var providerCode=dataWriter.GetHashCode()。哈希代码是same@edit你是对的。services.addScope();services.addScope()。这段代码使用了DbContext的两个实例。addScope(typeof(IDataProvider),x=>{return x.GetService();});addScope(typeof(IDataWriter),x=>{return x.GetService();});这就解决了问题。谢谢
 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();