2013-09-23 45 views
3

我試圖保存一個字符串(68kb大小)包含utf-8編碼xml到SQL Server 2012使用實體框架5.我使用代碼優先的方法。實體框架5不更新與XML字符串

但是,對於我的一些xml字符串(但不是全部),它保存了一個空字符串,並沒有任何xml。使用斷點確認在調用SaveChanges()之前正在分配數據。

下面是我使用的數據庫更新特定行的方法:

public void LogResponseMessage(MessageBase msg, DebugLog debugLog) 
    { 
     // Serialize the message using a helper class 
     string XMLMsg = SerializationHelper.XMLSerializeObject(msg, m_SerializationTypes, true); 

     debugLog.DtTmResponseLogged = DateTime.Now; 
     debugLog.ResponseMsg = XMLMsg; 

     using (var db = new LoggerContext()) 
     { 
      db.DebugLogs.Attach(debugLog); 
      var Entry = db.Entry(debugLog); 
      // Flag the updated columns as having been modified 
      Entry.Property(x => x.DtTmResponseLogged).IsModified = true; 
      Entry.Property(x => x.ResponseMsg).IsModified = true; 
      db.SaveChanges(); 
     } 
    } 

debugLog.ResponseMsg是我遇到的麻煩列。 DebugLog是一個包含列定義的類。 ResponseMsg獲取了一個XML序列化的.NET對象,然後我想保存它。我將列標記爲已修改,但對於某些特定的字符串,它只保存一個空字符串。 EF不會引發異常,我可以使用調試器查看debugLog.ResponseMsg中的XML。字符串屬性ResponseMsg具有[MaxLength]屬性集,並且該列在SQL Server中被創建爲nvarchar(max)

我最初的想法是它是某種編碼或尺寸問題,但我沒有取得任何進展 - 任何人都可以對此有所瞭解?

更新:它似乎是一個字符串長度問題。字符串> 43678個字符沒有被寫入,字符串< = 43678被寫入。至於這個限制來自哪裏,我仍然處於虧損狀態。

UPDATE2:已經創建了一個從無到有的項目,更新單個表,我看到完全一樣的問題,所以我知道這是不是一個「錯位移民」問題,無論是。

回答

3

這是坦率地說,令人難以置信的解決方案,以防其他人遇到同樣的「問題」。

數據一直存在。但是,如果在Visual Studio 2012中使用SQL Server對象資源管理器並選擇「查看數據」,對於長度超過43678個字符的nvarchar列,您看不到數據(ResponseMsg列看起來是空的):

No Data

但是,如果你寫你自己的T-SQL查詢,然後就看到在結果窗格中的數據:

Data

哎呀。這就是爲什麼我應該使用SQL Management Studio!