Сохранение объекта в базе данных приводит к следующему: «На объектный объект нельзя ссылаться несколькими экземплярами IEntityChangeTracker»

1

Я пытаюсь сохранить объект в моей базе данных, но я не могу из-за указанного выше сообщения об исключении.

Вот что я делаю:

Player player = playerRepository.Find(universeId, playerId);
UserProperties userProperties = userPropertiesRepository.Find(User.Identity.GetUserId());

rated = new Ratings
{
    Player = player,
    RatingType = ratingsIdentifier,
    UserProperties = userProperties
};

ratingsRepository.InsertOrUpdate(rated);

Метод InsertOrUpdate()Save()):

public void InsertOrUpdate(Ratings ratings)
{
    if (ratings.RatingsId == default(int))
    {
        // New entity
        context.Ratings.Add(ratings); // this is where the exception happens
    }
    else
    {
        // Existing entity
        context.Entry(ratings).State = EntityState.Modified;
    }

    Save();
}

public void Save()
{
    context.SaveChanges();
}

У меня есть базовое понимание проблемы, я просто не знаю, как ее решить. Я могу сказать, что это связано с объектами Player и UserProperties, потому что, если они являются нулевыми, это не дерьмо, когда я пытаюсь сохранить.

Мой контекстный класс:

public class ApplicationUser : IdentityUser
{
}

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public ApplicationDbContext()
        : base("DefaultConnection")
    {
    }

    public DbSet<Player> Players { get; set; }
    public DbSet<ServerData> ServerDatas { get; set; }
    public DbSet<Ratings> Ratings { get; set; }
    public DbSet<UserProperties> UserProperties { get; set; }

    // some more DbSet<>
}

Я пробовал читать другие темы об этом, но я не могу, например, detach() от IdentityDbContext. Я здесь совершенно не понимаю.

Теги:
entity-framework

1 ответ

1
Лучший ответ

Вы должны убедиться, что все хранилища используют один и тот же контекст для атомных операций. поэтому вам нужно создать свой контекст и передать его в свои репозитории в конструкторе. Что-то вроде этого:

var ctx = new ApplicationDbContext();
var playerRepository = new PlayerRepository(ctx);
var userPropertiesRepository = new UserPropertiesRepository(ctx);
  • 0
    Спасибо, я использовал stackoverflow.com/questions/21671590/…, чтобы решить мою проблему.
  • 0
    Да, парадигма UoW обычно используется в сочетании с репозиториями. Рад, что вы получили это отсортировано.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню