繁体   English   中英

为什么更新其他记录时会删除一些记录?

[英]Why is some records deleted when updating others?

我有一个奇怪的问题,更新我的数据库中的一些记录会自动删除其他记录。

楷模:

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();

    [...]

}

奇怪的是,当我保存这些更改时,不是船长的成员会从数据库中删除。 Team og Member (Captain) 状态已正确更新。

这怎么可能 - 以及如何避免它?

这是一个简单的工作演示,如下所示:

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(根据您的数据库数据,一个团队包含多个成员,因此您需要在 class Team中将Member更改为List<Member> ):

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.结果: 在此处输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM