我正在尝试使用Entity Framework 5将包含utf-8编码的xml的字符串(大小为68kb)保存到SQL Server 2012中。我正在使用代码优先方法。
但是,对于我的一些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 :已经从头开始创建了一个项目,它更新了一个表并且看到了完全相同的问题,所以我知道这不是一个“错误的迁移”问题。
答案 0 :(得分:3)
坦率地说,这是一个令人难以置信的解决方案,以防其他人遇到同样的“问题”。
数据始终存在。但是,如果在Visual Studio 2012中使用SQL Server对象资源管理器并选择“查看数据”,则对于长度超过43678个字符的nvarchar列,您看不到数据(ResponseMsg列看起来为空):
但是如果您编写自己的T-SQL查询,那么您将在结果窗格中看到数据:
哎呀。这就是我应该使用SQL Management Studio的原因!