我有两个班级
public class InvoiceRow
{
public int Id { get; set; }
public int InvoiceId { get; set; }
public int ProductId { get; set; }
public virtual Product Product { get; set; }
public int Amount { get; set; }
}
public class Invoice
{
public int Id { get; set; }
private ICollection<InvoiceRow> _rows;
public virtual ICollection<InvoiceRow> Rows => _rows ?? (_rows = new List<InvoiceRow>());
}
我在存储库类中使用Update方法
public void Update(Invoice record)
{
dB.Invoices.Update(record);
dB.SaveChanges();
}
它用于更新行集合中的值并添加新行,但是,如果我传递的行数少于数据库中的行数,它不会删除项目。最好的方法是什么?
答案 0 :(得分:3)
这是因为数据库中的行未标记为删除。
仅更新新的或更改的项目。集合中的“缺失”项目不被视为删除。
因此,您需要做的是自己标记要删除的项目。像这样:
public void Update(Invoice record)
{
var missingRows = dB.InvoiceRows.Where(i => i.InvoiceId == record.Id)
.Except(record.Rows);
dB.InvoiceRows.RemoveRange(missingRows);
dB.Invoices.Update(record);
dB.SaveChanges();
}
答案 1 :(得分:0)
另一种解决方案是声明复合主键Formula
和 InvoiceRow.Id
。现在是识别关系。因此,当从父记录中删除子记录时,EF Core确实会删除它们。
https://stackoverflow.com/a/17726414/7718171