Я пытаюсь сохранить объект в моей базе данных, но я не могу из-за указанного выше сообщения об исключении.
Вот что я делаю:
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
. Я здесь совершенно не понимаю.
Вы должны убедиться, что все хранилища используют один и тот же контекст для атомных операций. поэтому вам нужно создать свой контекст и передать его в свои репозитории в конструкторе. Что-то вроде этого:
var ctx = new ApplicationDbContext();
var playerRepository = new PlayerRepository(ctx);
var userPropertiesRepository = new UserPropertiesRepository(ctx);