Witam, mam pewien problem. Przykładowo mamy nowego użytkownika, który nie posiada żadnej postaci, następnie chce ją utworzyć, wywołuje metodę CreateCharacter
. Jeśli pomyślnie utworzę postać i dodam ją do listy postaci użytkownika wszystko jest ok, user.Characters.Count == 1
ale po wywołaniu await _context.SaveChangesAsync();
postać się duplikuje user.Characters.Count == 2
, prawdopodobnie tylko w pamięci bo w bazie danych jest tylko jedna. Czy ktoś wie w czym tkwi problem?
public abstract class Entity
{
public long Id { get; }
protected Entity()
{
}
protected Entity(long id)
{
Id = id;
}
public override int GetHashCode()
{
return (GetType().FullName + Id).GetHashCode();
}
public static bool operator ==(Entity? left, Entity? right)
{
if (left is null ^ right is null)
return false;
return left is null || left.Equals(right);
}
public static bool operator !=(Entity? left, Entity? right)
{
return !(left == right);
}
}
public class Character : Entity
{
public string Name { get; set; }
// ...
}
public class User : Entity
{
public string Username { get; set; }
public ICollection<Character> Characters { get; set; } = new HashSet<Character>();
// ...
public User()
{
}
public User(long id)
: base(id)
{
}
}
public class CreateCharacterHandler
{
private readonly DataContext _context;
private readonly ILoggedUser _loggedUser;
private readonly IMapper _mapper;
public CreateCharacterHandler(DataContext context, ILoggedUser loggedUser, IMapper mapper)
{
_context = context;
_loggedUser = loggedUser;
_mapper = mapper;
}
public async Task<Result<IReadOnlyList<CharacterDto>>> CreateCharacter(CreateCharacterCommand command)
{
var user = await _context.Users
.Include(u => u.Characters)
.FirstOrDefaultAsync(u => u.Id == _loggedUser.Id);
if (user == null)
return Result<IReadOnlyList<CharacterDto>>.Fail(ErrorCode.UserNotFound);
var character = _mapper.Map<Character>(command);
var canAdd = user.CanAddCharacter(character);
if (!canAdd.IsSuccess)
return Result<IReadOnlyList<CharacterDto>>.Fail(canAdd.Message);
user.Characters.Add(character);
// user.Characters.Count; == 1
await _context.SaveChangesAsync();
// user.Characters.Count; == 2
return Result<IReadOnlyList<CharacterDto>>.Success(
_mapper.Map<IReadOnlyList<CharacterDto>>(user.Characters));
}
}