0

Entity Framework は画像の変更を誤って検出しますか?

次のように定義された「Person」エンティティクラスがあります。

public class Person
{
 public int Id { get; set; }
 public byte[] Photo { get; set; }
}

データソースを使用して、Photo をフォームの PictureBox コントロールにバインドしました。そこのフォームは、動的に作成された bindingNavigator も使用します。

キャプチャされた変更を入力するための監査ログも作成しました。プロシージャは ObjectContext DetectChanges() を呼び出してから、

var entries = ObjectContext.ObjectStateManager.GetObjectStateEntries()    

写真が変更されたことを示すエントリが含まれています。
entry.OriginalValues[名前] は、entry.CurrentValues[名前] と一致します

SQL Server の列は varbinary(MAX) で、読み込んだ画像ファイルのサイズは 1Mb 未満です

すべての列を null に設定すると、エラーは発生しなくなりました

ファイルを取得するために使用するコードは

private void LoadPhotoButton_Click(object sender, EventArgs e)
{
   using (var dlg = new OpenFileDialog())
  {
      dlg.Filter = "JPEG files |*.jpg";
      if (dlg.ShowDialog() == DialogResult.OK)
      {
          PhotoPictureBox.Image = Image.FromFile(dlg.FileName);
      }
   }
 }

ここで、これらのフィールドが文字列変換に関係している場合、パディング文字として 16 進数のゼロを挿入できることに注意してください。

フォームからピクチャボックスを削除するか、コントロールをピクチャボックスではなくテキストボックスとしてバインドすると、動作は正しくなります(テキストボックスにバインドされたピクチャが使用されるわけではありません)

ピクチャ ボックスに直接バインドしないことで、この問題を回避できます。代わりに、BindingSource_CurrentChanged イベントにロードするだけです。

private void BindingSource_CurrentChanged(object sender, EventArgs e)
    {
        var obj = (Person) BindingSource.Current;
        this.PictureBox.Image = byteArrayToImage( obj.Photo);
    }

public Image byteArrayToImage(byte[] byteArrayIn)
    {
        MemoryStream ms = new MemoryStream(byteArrayIn);
        Image returnImage = Image.FromStream(ms);
        return returnImage;
    }
4

1 に答える 1

0

私は自分の回避策を使用しています-質問の最後に回答として文書化されています。

于 2013-01-18T04:02:34.157 に答える