簡體   English   中英

C#,實體框架,如何同時更新(刪除、添加、編輯)多行?

[英]C#, Entity Framework, How to Update(delete, add, edit) multiple rows at same time?

有時,我們希望根據客戶的要求或根據庫存數量,通過添加、刪除和編輯訂單來更改訂單詳細信息。

所以現在想要獲取一些列表和更新,包括刪除、編輯、添加行,然后保存在數據庫中

什么是 C#、EntityFramework 的最佳有效方式?

public class OrderDetail
{
  public int Id { get; set; }
  public int OrderId {get; set; }
  public int Qty{ get; set; }
  public string ItemName { get; set; }
}

/// Dummy db, OrderDetail Table
{
 {1, 1000, 24,"A"},
 {2, 1000, 12,"B"}
}


public void Update()
{
  using(var db = new xxEntities())
  {
    // Get All orders, OrderId==1000, total 2rows
    List<OrderDetails> list = db.OrderDetails.Where(x=> x.OrderId==1000).ToList();
    
    // remove some row or rows
    var temp1 = list.First(x=> x.Id==1);
    list.Remove(temp);

    // edit some row or rows
    var temp2 = list.First(x=> x.Id==2);
    temp2.Qty=100;
    
    // add some row or rows
    list.Add(new OrderDetail{ Id=3, OrderId=1000, Qty=2, ItemName="C"});
    list.Add(new OrderDetail{ Id=4, OrderId=1000, Qty=2, ItemName="D"});

    // Apply all changes
   db.SaveChanges();
  }
}


附加問題

public void UpdateOrder(int orderId, List<OrderDetail> newOrders)
{
  var result = db.OrderDetails.Where(x=>x.OrderId==orderId).ToList();
  result = newOrders;
 
 // it does not work
 //db.OrderDetails.Update(result);

 db.OrderDetails.RemoveRange(result);
 db.OrderDetails.AddRange(newOrders);

 db.SaveChange();
}

更新多行是正確的方法嗎?

正如另一個答案中提到的...... EF 將為檢測到的每個更改(即更新、插入、刪除)創建單獨的語句,並在單個事務中提交它們。 完成工作,但可能非常“健談”。 好處是您無需擔心它是如何完成的細節。 很容易修改數據對象並調用 SaveChanges。

如果您可以考慮不使用 EF 進行這樣的更新……我們進行此類更新的一種方法是創建 System.Data.DataTable 並將其用作存儲過程中的表值參數(如果您的數據存儲支持它)。

元代碼:

var dt = new DataTable();
var newRow = dt.NewRow();
newRow["column1"] = newdata; 
dt.Rows.Add(newRow);

然后只需使用dt作為輸入參數,讓存儲過程確定插入/更新/刪除操作。

除了進行所有更改然后調用 SaveChanges 之外,沒有“最有效”的方法。 Ef 將在其上發出大量 SQL 語句(每個操作一個)。

有最有效的方法,因為無法改變 Ef 的工作方式,並且 Ef 更新的方式只有一種。 它們不會同時發生。 時期。 當您調用 SaveChanges 時,它們發生在一個事務中,一個接一個。

如果要在 Entity Framework 的表中添加/刪除/更新行,則必須添加/刪除/更新DbSet的項目,而不是獲取的數據。

using (var dbContext = new OrderContext())
{
    // Add one Order
    Order orderToAdd = new Order
    {
        // fill required properties; don't fill primary key
    }

    var addedOrder = dbContext.Orders.Add(orderToAdd);
    // note: addedOrder has no Id yet.

    // Add several Orders
    IEnumerable<Order> orders = ...
    dbContext.Orders.AddRange(orders);

    dbContext.SaveChanges();
    // now they've got their id:
    Debug.Assert(addedOrder.Id != 0);
    Debug.Assert(orders.All(order => order.Id != 0);
}

要刪除,您首先必須獲取完整的訂單

int orderIdToDelete = ...
using (var dbContext = new OrderContext())
{
    Order orderToDelete = dbContext.Orders.Find(orderIdToDelete);
    dbContext.Orders.Remove(orderToDelete);

    var ordersToDelete = dbContext.Orders
        .Where(order => order.Date.Year < 2000)
        .ToList();
    dbContext.Orders.RemoveRange(ordersToDelete);

    // the orders are not deleted yet.
    dbContext.SaveChanges();
}

要更新,您首先必須獲得值:

int orderIdToUpdate = ...
Order orderToUpdate = dbContext.Orders.Find(orderIdToUpdate);
orderToUpdate.Date = DateTime.Today;

var today = Datetime.Today;
var dateLimit = today.AddDays(-28);
var nonPaidOrders = dbContext.Orders
    .Where(order => !order.Paid && order.Date < dateLimit)
    .ToList();
foreach (var order in nonPaidOrders)
{
    this.SendReminder(order);
    order.ReminderDate = today;
}
dbContext.SaveChanges();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM