无法从多对多关系中删除

问题描述 投票:0回答:1

我有一个间接多对多关系的教科书示例。

我可以检索新实体并将其添加到关系中,但无法删除它们。

从我遵循的所有示例来看,它根本不起作用。

数据模型:

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();
entity-framework-core
1个回答
0
投票
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();

...会起作用的。

© www.soinside.com 2019 - 2024. All rights reserved.