C# 为什么在更新其他记录时会删除某些记录?
我有一个奇怪的问题,更新数据库中的一些记录会自动删除其他记录 型号:C# 为什么在更新其他记录时会删除某些记录?,c#,asp.net-core,entity-framework-core,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 {
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();
[...]
}
公共异步任务OnGetAsync()
{
var incompletedTeams=wait_context.Teams.Include(x=>x.Captain)。其中(x=>x.Status==0&&&(DateTime.Now-x.CreatedAt)。分钟数>30&&x.Captain.Captain.toListSync();
foreach(不完全团队中的var团队)
{
团队状态=-1;
team.Captain.Status=-1;
}
wait_context.SaveChangesAsync();
[...]
}
奇怪的是,当我保存这些更改时,不是队长的成员从数据库中删除。团队og成员(队长)状态已正确更新
这怎么可能?如何避免它?下面是一个简单的工作演示: 1.1背景:
public class SO1010testContext : DbContext
{
public SO1010testContext (DbContextOptions<SO1010testContext> options)
: base(options)
{
}
public DbSet<Team> Teams { get; set; }
public DbSet<Member> Members { 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();
}
}
公共类索引模型:PageModel
{
私有只读SO1010testContext\u上下文;
公共索引模型(SO1010testContext)
{
_上下文=上下文;
}
公共异步任务OnGetAsync()
{
var incompletedTeams=\u context.Teams.Include(x=>x.Captain)
.Where(x=>x.Status==0&&(DateTime.Now-x.CreatedAt).Minutes>30)
.ToList();
foreach(不完全团队中的var团队)
{
var成员=团队。队长;
var captain=member.Where(m=>m.captain.ToList();
foreach(船长中的var c)
{
团队状态=-1;
c、 状态=-1;
}
}
wait_context.SaveChangesAsync();
返回页();
}
}
4.结果:
除了船长之外,您似乎没有任何与成员相关的导航属性我希望在你们的团队课上看到一个ICollection。不确定这会有什么不同,但可能EF假设行是孤立的。@Sam我确实希望这样,但是当我在Team类中设置
public IList成员{get;set;}
时,我得到一个导航属性错误。不知道为什么。我以前做过一百次。也许我不能在同一个类中有两个成员关系?你必须用fluent config配置这些关系。由于您最终将同时拥有一对一和一对多对同两种类型,因此需要明确告诉EF一侧的哪些属性对应另一侧的哪些属性。谢谢@ChrisPratt,我将对此进行研究。但这也是问题的答案吗?可能不是,但我看不到任何明显的解释。无论如何,我会首先确保关系设置正确,因为这可能是一个潜在的问题。这可能会起作用,这就是我现在正在做的。我只想查询单个成员(船长),而不是所有成员,然后过滤它们以找到船长。我需要这几个地方,例如在一个球队名单上,也显示队长。我仍然不明白为什么在更新队长时会删除团队中的所有其他成员。。。
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();
}
}