1

EntityFramework は、xml フィールドの不完全なデータを返します。データをシリアル化し、これをデータベースの xml フィールドに保存します。不足しているデータは、xml の Images ノードの値にあり、シリアル化されたオブジェクトとしてもシリアル化されます。フィールドオブジェクトをシリアル化すると、値のエンコードが行われます。

[画像] -> [値] フィールドから欠落しているデータはどこにあり、なぜ消えてしまうのですか?

これは、ms sql xml フィールドにあるものです。

<ArrayOfField xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Field>
    <Key>Images</Key>
    <Value>&lt;ArrayOfImage xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"&gt;
  &lt;Image&gt;
    &lt;Name&gt;Penguins.jpg&lt;/Name&gt;
    &lt;Path&gt;~/Fileshare/Pages/6/Penguins.jpg&lt;/Path&gt;
    &lt;AltText&gt;Test&lt;/AltText&gt;
  &lt;/Image&gt;
  &lt;Image&gt;
    &lt;Name&gt;Tulips.jpg&lt;/Name&gt;
    &lt;Path&gt;~/Fileshare/Pages/6/Tulips.jpg&lt;/Path&gt;
    &lt;AltText&gt;Test&lt;/AltText&gt;
  &lt;/Image&gt;
&lt;/ArrayOfImage&gt;</Value>
  </Field>
  <Field>
    <Key>Test</Key>
    <Value>Test</Value>
  </Field>
  <Field>
    <Key>MyEditor</Key>
    <Value />
  </Field>
</ArrayOfField>

これは EF が返すものです。

<ArrayOfField xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><Field><Key>Images</Key><Value>&lt;ArrayOfImage xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" /&gt;</Value></Field><Field><Key>Test</Key><Value>Test</Value></Field><Field><Key>MyEditor</Key><Value /></Field></ArrayOfField>

次のように EntityFramework からデータを取得します。

  public Item Get(int id)
        {
            using (var context = new Entities())
            {
                var item = context.Items.SingleOrDefault(x => x.ID == id);
                return item;
            }
        }
4

2 に答える 2

1

xml フィールド データを返すには、ストアド プロシージャを記述する必要があると思います。Entity Framework の場合、xml データの完全なリストを取得するには、次のように記述する必要があります。

EntityCommand command = connection.CreateCommand();
command.CommandText = "XXXX";
command.CommandType = CommandType.StoredProcedure;

using (EntityDataReader reader = command.ExecuteReader(CommandBehavior.SequentialAccess))
{
    while (reader.Read())
    {
          str = str + reader.GetString(0);
    }
}
于 2012-12-20T03:28:23.197 に答える
0

逆シリアル化中にデータが失われたか、疲労による間違いだと思います (つまり、比較するときに別のエンティティを見て、何か問題があると思うかもしれません)。

いずれにせよ、シリアライゼーションの問題を除外する別の方法は、別のものとしてシリアライズして保存するか、単に ArrayOfImages をクラス メンバーとして追加するだけで (問題はないはずですが)、xml に xml が含まれないようにすることです。配列内の別のキーと値のペア。

于 2012-12-20T07:25:38.217 に答える