3

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.ResponseMsgEF によって例外がスローされることはなく、デバッガーを使用してXML を表示できます。文字列プロパティResponseMsgには[MaxLength]属性セットがあり、列は SQL Server で として作成されますnvarchar(max)

私の最初の考えは、それはある種のエンコーディングまたはサイズの問題ですが、どちらについてもあまり進歩していません-誰かがこれに光を当てることができますか?

更新:文字列の長さの問題のようです。文字列 > 43678 文字は書き込まれませんが、文字列 <= 43678 は書き込まれます。この制限がどこから来ているのか、私はまだ途方に暮れています。

Update2 : 単一のテーブルを更新するプロジェクトを最初から作成し、まったく同じ問題が発生しているため、「破損した移行」の問題でもないことがわかっています。

4

1 に答える 1

3

そして、他の誰かが同じ「問題」に遭遇した場合に備えて、率直に言って、信じられないほどの解決策があります。

データはずっとそこにありました。ただし、Visual Studio 2012 で SQL Server オブジェクト エクスプローラーを使用して [データの表示] を選択すると、長さが 43678 文字を超える nvarchar 列のデータが表示されません (ResponseMsg 列は空に見えます)。

データなし

ただし、独自の T-SQL クエリを作成すると、結果ウィンドウにデータが表示されます。

データ

ああ。これが、私が SQL Management Studio を使用すべき理由です。

于 2013-09-23T15:26:08.043 に答える