簡體   English   中英

數據上下文保存更改在 C# 實體框架中不起作用

[英]data context save changes not working in C# entity framwork

我正在嘗試執行以下查詢

using (var dbcontext = new EVEntities())
{
    var data_header = dbcontext.Cl.Where(x => x.PKey == 
        header_key).FirstOrDefault();
    if (data_header != null)
    {
        data_header.EstimatedCost = Math.Round(estimated_cost,2);
        data_header.ClaimedCost = Math.Round(claimed_cost,2);
        dbcontext.Entry<Cl>(data_header).State = System.Data.Entity.EntityState.Modified;
        dbcontext.SaveChanges();
        Writelog("Updated");
    }
}

這里Writelog寫在一個文本文件中,它一直在工作。 但是 Cl 中的字段沒有得到更新。 在數據之間也得到更新。

連接字符串

<connectionStrings><add name="EVEntities" connectionString="metadata=res://*/xxx_Entity_Model.csdl|res://*/xxx_Entity_Model.ssdl|res://*/xxx_Entity_Model.msl; provider=System.Data.SqlClient;provider connection string=&quot;data source=xxxxxx;initial catalog=xxxxx;persist security info=True;user id=xx;password=xxxxx;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient"/></connectionStrings>

編輯1

也嘗試了原始更新

dbcontext.Database.ExecuteSqlCommand(@"UPDATE dbo.Claims 
SET EstimatedCost = @e_cost, ClaimedCost = @c_cost WHERE Pkey =
 @p_key",
new SqlParameter("e_cost", Math.Round(estimated_cost, 2)),
new SqlParameter("c_cost", Math.Round(claimed_cost, 2)),
new SqlParameter("p_key", claim_header_key));

同樣的結果。 它會在兩者之間更新。 沒有錯誤。

你沒有給我們足夠的信息來給你解決方案。 因此,我給你一個調試問題的方法。

  • DbContext 是否認為必須保存任何內容?
  • 什么 SQL 發送到數據庫?

當您調用 SaveChanges 時,DbContext 檢查其ChangeTracker以查看是否必須更新任何內容。 考慮寫一些Debug代碼來檢測是否有變化。

在 SaveChanges 之前插入:

bool changesDetected = dbContext.ChangeTracker.HasChanges;

您可能需要先調用DetectChanges() 我不確定。

如果有 Changes,檢查你認為應該更新的項目是否發生了變化:

IEnumerable <DbEntityEntry<Cl>> entries = dbContext.ChangeTracker.Entries<Cl>;

// We're expecting exactly one entry:
DbEntityEntry<Cl> myEntry = entries.SingleOrDefault();
Assert(myEntry != null);

如果是null,請嘗試找出未被跟蹤的原因。 在您獲取它之后,在您更改它之前是否對其進行了跟蹤? 你有什么地方跟蹤關閉嗎? 在獲取其他數據的地方編寫一些其他調試代碼。 被跟蹤了嗎?

如果不是 null,那么顯然您的 Cl 已被跟蹤。 它應該被改變:

Assert(myEntry.State == EntityState.Modified);

如果沒有修改,獲取原始值和當前值:

DbPropertyValues originalValues = myEntry.OriginalValues;
DbPropertyValues currentValues = myEntry.currentValues;

在您的調試器中,檢查它們,或編寫一些調試代碼以將原始值與當前值進行比較。 更改后的值是否正確?

我不確定實體框架是否會嘗試更新未修改且原始值不等於當前值的對象。 當您執行 SaveChanges 時,我們將了解創建了什么 SQL。

如果您的數據庫可以記錄所有通信,那就太好了。

您還可以記錄實體框架發送到數據庫的內容。 為此,請使用屬性DbContext.Database.Log 例如:

dbContext.Database.Log = Console.Write;
dbContext.SaveChanges();

如果不能寫入Console,寫一個方法:

private List<string> SqlCommands {get;} = new List<string>();

void LogSqlCommands(string sqlCommand)
{
    this.SqlCommands.Add(sqlCommand);
}

在您的方法中,以下調試代碼:

using (var dbcontext = new EVEntities())
{
    this.SqlCommands.Clear();
    dbContext.Database.Log = this.LogSqlCommands;
    var data_header = ... etc

    dbContext.SaveChanges();
}

SaveChanges后打斷點,查看生成的SQL。

希望這些調試技巧可以幫助您找到問題的原因

暫無
暫無

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

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