2012-03-07 11 views
0

私たちのデータベースにはユーザーがいます。ユーザーは、特定のメタデータ(場所、年齢など)を関連付けることができます。それに加えて、彼らはプロフィール画像を持っています。 ユーザーはいつでもこれらのものを編集できます。個々のフィールドのEntityStateの変更を確認する

enter image description here

我々はに実行する問題は、ユーザーが自分の情報を編集するために行くが、彼らは画像を選択しないときということです - 前の画像は消去されます(NULL)。

私は、私はそれが次のコードを使用して、当社のユーザー・リポジトリに遊びに来る把握我々が変更したユーザーを保存するために行くとき、私たちはif(user.profileImage == null) don't save it

を言うことができる必要があることを理解:

public void SaveUser(Domain.Entities.User user) 
     { 
      if (user.UserId == 0) 
      { 
       context.Users.Add(user); 
      } 
      else 
      { 
       context.Entry(user).State = EntityState.Modified; 
       //The logic would be here 
      } 
      context.SaveChanges(); 
     } 

しかし私はそれが何をしようとしても動作しないようです。

私の質問です:EntityState全体ではなく個々のフィールドの変更を確認する方法はありますか?

答えて

0

セッションに画像データを保存した後、画像のアップロードがnullの場合、セッション属性を画像に挿入するだけで、空のままにしておくと効果的に古い画像が維持されます。ポストで次に

Session["image"] = productService.GetProduct(id).Image;

私は言った...

if (image != null) 
       { 
        product.ImageType = image.ContentType; 
        product.Image = new byte[image.ContentLength]; 
        image.InputStream.Read(product.Image, 0, image.ContentLength); 
       } 
       else 
       { 
        product.Image = (byte[])Session["image"]; 
       } 
+0

正直言って良い回避策ではありません。ユーザーは、送信ボタンをクリックする前に画像が消えてしまった理由が不思議に思うでしょう。私は私の答えに代替案を掲示しました。基本的に、壊れやすいセッションオブジェクトではなく、イメージが既に格納されているストレージとしてデータベースを使用します。 – Slauma

0

はい、方法があります:

context.Users.Attach(user); 
context.Entry(user).Property(u => u.Location).IsModified = true; 
context.Entry(user).Property(u => u.Age).IsModified = true; 
// etc. 

は変更されプロパティがマークされたら、あなたはfalseIsModifiedを設定することができないことに注意してください。したがって、このような何か...

context.Entry(user).State = EntityState.Modified; 
context.Entry(user).Property(u => u.Image).IsModified = false; 

... を動作しません。

編集代替ソリューション:ユーザーが新しいイメージ(= user.profileImage == null)を投稿していなかった場合、それはデータベース内にあるように、これはprofileImageの値を保持します

public void SaveUser(Domain.Entities.User user) 
{ 
    if (user.UserId == 0) 
    { 
     context.Users.Add(user); 
    } 
    else 
    { 
     var userInDb = context.Users.Single(u => u.UserId == user.UserId); 

     if (user.profileImage == null) 
      user.profileImage = userInDb.profileImage; 

     context.Entry(userInDb).CurrentValues.SetValues(user); 
    } 
    context.SaveChanges(); 
} 

は、それ以外の場合は、新しいイメージを保存します。

+0

それでは、どのように明示的に言うだろう「このフィールドは、それには何も持っていない場合、それを更新しないのですか?」 – Johannes

+0

@Johannes:わかりません:If(user.Image!= null && user.Image.Length> 0)context.Entry(user).Property(u => u.Image) .IsModified = true; 'EFにそれが自動的に行われるようにするオプションはないと思います。結局のところ、EFの場合、 "それには何もない"という値は他の値と同様にUPDATEを書く有効な値です。 – Slauma

関連する問題