我有一个奇怪的问题,在数据库中更新某些记录会自动删除其他记录。
型号:
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();
[...]
}
奇怪的是,当我保存这些更改时,不是船长的成员将从数据库中删除。团队成员(队长)状态已正确更新。
那怎么可能-以及如何避免呢?
答案 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();
}
}