![](/img/trans.png)
[英]Entity Framework is deleting the existing items from the collection when I add new
[英]Entity Framework Core, deleting items from nested collection
我有兩節課
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>());
}
我在存儲庫類中使用更新方法
public void Update(Invoice record)
{
dB.Invoices.Update(record);
dB.SaveChanges();
}
它適用於更新行集合中的值並添加新行,但是如果我傳遞的對象的行數少於數據庫中的行數,它不會刪除項目。 最好的方法是什么?
那是因為數據庫中的行沒有被標記為刪除。
僅更新新的或更改的項目。 集合中的“缺失”項目不被視為已刪除。
因此,您需要自己標記要刪除的項目。 像這樣的東西:
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();
}
另一種解決方案是聲明一個復合主鍵InvoiceRow.Id
和InvoiceRow.InvoiceId
。 現在它是一個識別關系。 因此,當子記錄從父記錄中刪除時,EF Core 確實會刪除它們。
https://stackoverflow.com/a/17726414/7718171
我正在使用 Entity Framework Core 6,以下代碼適用於我。
public void Update(Invoice invoice)
{
//1. valid invoice rows ids
var validInvoiceRowIds = invoice.InvoiceRows.Select(ir => ir.Id).ToList();
//2. missing invoice rows
var missItems = _context.InvoiceRows
.Where(ir => ir.InvoiceId == invoice.Id && !validInvoiceRowIds.Contains(ir.Id))
.ToList();
_context.RemoveRange(missItems);
_context.Update(entity);
_context.SaveChanges();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.