为什么更新某些记录时会删除某些记录?

时间:2019-10-09 16:22:03

标签: c# asp.net-core entity-framework-core

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

型号:

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 :(得分:0)

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

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.Method:

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