Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架在新的DBContext中更新多对多关系_C#_Entity Framework_Many To Many - Fatal编程技术网

C# 实体框架在新的DBContext中更新多对多关系

C# 实体框架在新的DBContext中更新多对多关系,c#,entity-framework,many-to-many,C#,Entity Framework,Many To Many,我在组和用户之间有一种多对多的关系。我希望从DBContext加载元素,修改它们,然后将它们附加到新的DBContext(出于各种原因,在加载和保存之间保持上下文的活动性不是一个好的解决方案) 在下面的代码中,我重新创建了场景,但由于某种原因,重新连接和保存似乎不起作用 public class TUser { [Key] public int Id { get; set; } public ICollection<TGroup> Groups { get;

我在组和用户之间有一种多对多的关系。我希望从DBContext加载元素,修改它们,然后将它们附加到新的DBContext(出于各种原因,在加载和保存之间保持上下文的活动性不是一个好的解决方案)

在下面的代码中,我重新创建了场景,但由于某种原因,重新连接和保存似乎不起作用

public class TUser
{
    [Key]
    public int Id { get; set; }

    public ICollection<TGroup> Groups { get; set; } = new List<TGroup>();
}

public class TGroup
{
    [Key]
    public int Id { get; set; }
}

public class UserGroupDbContext : DbContext
{
    public UserGroupDbContext(DbConnection existingConnection, bool contextOwnsConnection)
        : base(existingConnection, contextOwnsConnection)
    {
    }

    public DbSet<TUser> Users { get; set; }
    public DbSet<TGroup> Groups { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<TUser>()
            .HasMany(u => u.Groups)
            .WithMany()
            .Map(m =>
            {
                m.MapLeftKey("UserId");
                m.MapRightKey("GroupId");
                m.ToTable("UserGroup");
            });

        base.OnModelCreating(modelBuilder);
    }
}

public class UserRepositoryTest
{
    public UserRepositoryTest()
    {
        var group1 = new TGroup();
        var group2 = new TGroup();
        var group3 = new TGroup();
        var user = new TUser { Groups = new List<TGroup> { group1, group2 } };

        var dbContextFixture = new DbContextFixture<UserGroupDbContext>();
        using (var dbContext = dbContextFixture.CreateContext())
        {
            dbContext.Groups.Add(group1);
            dbContext.Groups.Add(group2);
            dbContext.Groups.Add(group3);
            dbContext.Users.Add(user);

            dbContext.SaveChanges();
        }

        user.Groups.Remove(group2);
        user.Groups.Add(group3);

        using (var dbContext = dbContextFixture.CreateContext())
        {
            dbContext.Users.Attach(user);

            dbContext.SaveChanges();
        }

        using (var dbContext = dbContextFixture.CreateContext())
        {
            var loadedUser = dbContext.Users.Include(u => u.Groups).Single();
            Assert.True(loadedUser.Groups.Any(g => g.Id == group1.Id));
            Assert.True(loadedUser.Groups.Any(g => g.Id == group3.Id)); // <-- This line fails
            Assert.False(loadedUser.Groups.Any(g => g.Id == group2.Id)); // <-- This line fails
        }
    }
}
公共类TUser
{
[关键]
公共int Id{get;set;}
公共ICollection组{get;set;}=new List();
}
公共类t组
{
[关键]
公共int Id{get;set;}
}
公共类UserGroupDbContext:DbContext
{
public UserGroupDbContext(DbConnection existingConnection,bool contextOwnsConnection)
:base(现有连接、上下文连接)
{
}
公共数据库集用户{get;set;}
公共数据库集组{get;set;}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Entity()
.HasMany(u=>u.Groups)
.有很多
.Map(m=>
{
m、 MapLeftKey(“用户ID”);
m、 MapRightKey(“GroupId”);
m、 ToTable(“用户组”);
});
基于模型创建(modelBuilder);
}
}
公共类UserRepositoryTest
{
公共用户repositorytest()
{
var group1=新的TGroup();
var group2=新的TGroup();
var group3=新的TGroup();
var user=newtuser{Groups=newlist{group1,group2};
var dbContextFixture=new dbContextFixture();
使用(var dbContext=dbContextFixture.CreateContext())
{
dbContext.Groups.Add(group1);
dbContext.Groups.Add(group2);
dbContext.Groups.Add(group3);
dbContext.Users.Add(用户);
dbContext.SaveChanges();
}
user.Groups.Remove(group2);
user.Groups.Add(group3);
使用(var dbContext=dbContextFixture.CreateContext())
{
dbContext.Users.Attach(用户);
dbContext.SaveChanges();
}
使用(var dbContext=dbContextFixture.CreateContext())
{
var loadedUser=dbContext.Users.Include(u=>u.Groups.Single();
True(loadedUser.Groups.Any(g=>g.Id==group1.Id));

Assert.True(loadedUser.Groups.Any(g=>g.Id==group3.Id));///g.Id==group2.Id));//当您已经从另一个DBContext加载了一个实体,并且希望使用另一个DBContext对其进行更改,而不需要将模型附加到新的DBContext中时

这是因为新DbConext无法跟踪某些内容,因此无法知道是否有更改

请点击下面的链接


希望这有助于

当您在附加到上下文之前修改实体时,上下文不会意识到修改。您应该在附加后修改实体,或者将其状态设置为“已修改”


非常感谢。我也愿意接受Buram Hajrizaj的回答。