Идентичность: Как добавить элементы в связанные поля - PullRequest
0 голосов
/ 24 сентября 2019

Я хочу реализовать форму редактирования, но ошибка обновления элемента.Это небольшой пример.

public class AppUser : IdentityUser
{
    public string SurName { get; set; }
    public virtual ICollection<City> Cities{ get; set; }
    public AppUser()
    {
        Cities = new List<City>();          
    }
}

И модель для города

public class City
{        
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual ICollection<AppUser> Users { get; set; }
    public City()
    {
        Users = new List<AppUser>();
    }

}

И класс UserContext, выстраивающий отношение один ко многим между двумя моделями.

public class UserContext: IdentityDbContext<AppUser>
{
    public DbSet<City> Cities { get; set; }
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<City>().HasMany(x => x.Users)
            .WithMany(x => x.Cities)
            .Map(x => x.MapLeftKey("CityId")
            .MapRightKey("UserId")
            .ToTable("UserCity"));
        base.OnModelCreating(modelBuilder);
    }
}   

И если я пытаюсь обновить

UserContext db = new UserContext();
....
public ActionResult Edit()
{
 var newUser = UserManager.FindById(User.Identity.GetUserId());
 City city = db.Cities.FirstOrDefault();
 newUser.Cities = new List<City>() { city };
 newUser.SurName = "TestName";
 var result =  UserManager.Update(newUser);
 ....
}

Я вижу ошибку

System.InvalidOperationException: 
"The relationship between the two objects cannot be defined because 
 they are attached to different ObjectContext objects."

Если удалить строку

newUser.Cities = new List<City>() { city };

Ошибка не отображается,Почему возникает ошибка при добавлении поля со связями «многие ко многим»?

Ответы [ 2 ]

0 голосов
/ 25 сентября 2019

Полный список изменений кода

public ActionResult Edit()
{
 //var newUser = UserManager.FindById(User.Identity.GetUserId());
 City city = db.Cities.FirstOrDefault();
 newUser.Cities = new List<City>() { city };
 newUser.SurName = "TestName";
 //var result =  UserManager.Update(newUser);
 db.Entry(newUser).State = EntityState.Modified;
 db.SaveChanges();
 ....
}
0 голосов
/ 24 сентября 2019

решение: изменить с

var newUser = UserManager.FindById(User.Identity.GetUserId());

на

var newUser = db.Users.Include(x=>x.Cities).FirstOrDefault(x=>x.Id== userId);
...