Почему некоторые записи удаляются при обновлении других? - PullRequest
0 голосов
/ 09 октября 2019

У меня странная проблема, когда обновление некоторых записей в моей базе данных автоматически удаляет другие.

Модели:

public DbSet<Team> Teams { get; set; }
public DbSet<Member> Members { get; set; }

public class Team
{
    public int Id { get; set; }
    public string Name { get; set; }
    public DateTime CreatedAt { get; set; }
    public int Status { get; set; } // -1 = deleted, 0 = incomplete, 1 = completed (signup)
    public Member Captain { get; set; }
}

public class Member
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public bool Captain { get; set; }
    public int Status { get; set; } // -1 = deleted, 0 = inactive, 1 = active
    public int TeamId { get; set; }

    [ForeignKey("TeamId")]
    public Team Team { get; set; }
}

Команды в базе данных:

Id      Name      CreatedAt                  Status
1       Team 1    2019-07-10 09:32:12.123    1 
2       Team 2    2019-07-10 11:24:39.456    0

Участники в базе данных:

Id      FirstName    LastName    Captain    Status    TeamId
1       John         Doe         True       1         1
2       Jone         Doe         False      1         1
3       Foo          Bar         True       0         2

В процессе регистрации в команде новой команде присваивается статус 0, и после получения оплаты они обновляются со статусом 1. Когда регистрация команды завершена, капитанможет пригласить других участников присоединиться к команде.

Один раз в день я проверяю незавершенные команды (статус 0) и устанавливаю команду и связанного с ней участника (капитана) в статус -1:

public async Task<IActionResult> OnGetAsync()
{

    var incompletedTeams = await _context.Teams.Include(x => x.Captain).Where(x => x.Status == 0 && (DateTime.Now - x.CreatedAt).Minutes > 30 && x.Captain.Captain).ToListAsync();

    foreach (var team in incompletedTeams)
    {
        team.Status = -1;
        team.Captain.Status = -1;
    }

    await _context.SaveChangesAsync();

    [...]

}

Странно то, что когда я сохраняю эти изменения, Участник, который не является Капитаном, удаляется из базы данных. Статус члена команды (капитана) обновляется корректно.

Как это вообще возможно - и как этого избежать?

1 Ответ

0 голосов
/ 10 октября 2019

Вот простая рабочая демонстрация, как показано ниже:

1.DbContext:

public class SO1010testContext : DbContext
{
    public SO1010testContext (DbContextOptions<SO1010testContext> options)
        : base(options)
    {
    }
    public DbSet<Team> Teams { get; set; }
    public DbSet<Member> Members { get; set; }
}

2.Model (Из данных вашей базы данных одна команда содержит несколько участников, поэтому вам нужноизмените Member на List<Member> в классе Team):

public class Team
{
    public int Id { get; set; }
    public string Name { get; set; }
    public DateTime CreatedAt { get; set; }
    public int Status { get; set; } // -1 = deleted, 0 = incomplete, 1 = completed (signup)
    public List<Member> Captain { get; set; }
}
public class Member
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public bool Captain { get; set; }
    public int Status { get; set; } // -1 = deleted, 0 = inactive, 1 = active
    public int TeamId { get; set; }
    [ForeignKey("TeamId")]
    public Team Team { get; set; }
}

3. Метод:

public class IndexModel : PageModel
{
    private readonly SO1010testContext _context;

    public IndexModel(SO1010testContext context)
    {
        _context = context;
    }
    public async Task<IActionResult> OnGetAsync()
    {
        var incompletedTeams =  _context.Teams.Include(x => x.Captain)
            .Where(x => x.Status == 0 && (DateTime.Now - x.CreatedAt).Minutes > 30)
            .ToList();
        foreach (var team in incompletedTeams)
        {
            var member = team.Captain;
            var captain = member.Where(m => m.Captain).ToList();
            foreach (var c in captain)
            {
                team.Status = -1;
                c.Status = -1;
            }

        }
        await _context.SaveChangesAsync();
        return Page();
    }
}

4.Результат: enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...