我正在尝试使用 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 对象,然后我想要保存它。我将该列标记为已修改,但对于某些特定字符串,它只保存一个空字符串。debugLog.ResponseMsg
EF 没有抛出异常,我可以使用调试器查看 XML 。string 属性ResponseMsg
具有[MaxLength]
属性集,并且列在 SQL Server 中创建为nvarchar(max)
.
我最初的想法是它是某种编码或大小问题,但我在这方面都没有取得太大进展 - 任何人都可以对此有所了解吗?
更新:这似乎是一个字符串长度问题。字符串 > 43678 个字符不会被写入,字符串 <= 43678 会被写入。我仍然不知道这个限制来自哪里。
Update2:从头开始创建了一个项目,该项目更新了一个表并且看到了完全相同的问题,所以我知道这也不是“错位迁移”问题。