我有一个间接多对多关系的教科书示例。
我可以检索新实体并将其添加到关系中,但无法删除它们。
从我遵循的所有示例来看,它根本不起作用。
数据模型:
public class Job
{
public int JobId { get; set; }
public int AccountId { get; set; }
public string Name { get; set; }
public virtual Account PrimaryAccount { get; set; }
public virtual ICollection<AccountAlert>? AccountAlerts { get; set; }
}
public class Account
{
public int AccountId { get; set; }
public string Name { get; set; }
public virtual ICollection<AccountAlert>? AccountAlerts { get; set; }
}
public class AccountAlert
{
public int AccountId { get; set; }
public int JobId { get; set; }
public virtual Account Account { get; set; }
public virtual Job Job { get; set; }
}
DbContext
:
public class DataContext : DbContext
{
public DbSet<Account> Accounts { get; set; }
public DbSet<Job> Jobs { get; set; }
public DbSet<AccountAlert> AccountAlerts { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSnakeCaseNamingConvention();
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Account>().ToTable("account");
modelBuilder.Entity<Job>().ToTable("job");
modelBuilder.Entity<AccountAlert>().ToTable("account_alert").HasKey(x => new { x.JobId, x.AccountId });
}
}
删除代码:
var job = _dataContext.Set<Job>()
.Where(x => x.JobId == jobId)
.Include("AccountAlerts")
.Include("AccountAlerts.Account")
.AsNotTracked()
.Single();
foreach(var alert in job.AccountAlerts)
{
// Doesn't work
job.AccountAlerts.Remove(alert);
// Doesn't work
job.AccountAlerts.Remove(new AccountAlert { JobId = alert.JobId, AccountId = alert.AccountId });
// Doesn't work
job.AccountAlerts.Remove(new AccountAlert { AccountId = alert.AccountId });
}
await _dataContext.SaveChangesAsync();
var job = _dataContext.Set<Job>()
.Where(x => x.JobId == jobId)
.Include("AccountAlerts")
.Include("AccountAlerts.Account")
.AsNotTracked()
.Single();
如果在上面的示例中您的意思是您正在使用
.AsNoTracking()
,则否,您无法从返回的作业中删除项目并调用 SaveChanges
,这依赖于更改跟踪。用途:
var job = await _dataContext.Set<Job>()
.Where(x => x.JobId == jobId)
.Include(x => x.AccountAlerts)
.SingleAsync();
然后
foreach(var alert in job.AccountAlerts)
{
job.AccountAlerts.Remove(alert);
}
await _dataContext.SaveChangesAsync();
...会起作用的。