其他分享
首页 > 其他分享> > 实体框架5不使用xml字符串更新行

实体框架5不使用xml字符串更新行

作者:互联网

我正在尝试使用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:已经从头开始创建了一个项目,该项目更新了一个表并看到了完全相同的问题,因此我知道这也不是“复杂的迁移”问题.

解决方法:

坦率地说,这是万一其他人遇到相同“问题”的不可思议的解决方案.

数据一直在那里.但是,如果在Visual Studio 2012中使用SQL Server Object Explorer并选择“查看数据”,则对于长度超过43678个字符的nvarchar列,您看不到数据(ResponseMsg列看起来为空):

但是,如果您编写自己的T-SQL查询,则会在结果窗格中看到数据:

啊这就是为什么我应该使用SQL Management Studio!

标签:entity-framework-5,xml,c,entity-framework
来源: https://codeday.me/bug/20191122/2062042.html