2017-01-29 4 views
0

私のASP.NETページで定期的にデータを同期しています。私は2つの複雑なメンバーを持つオブジェクトを持っています。これは、NotMapped属性を使用してEntity Frameworkで無視しています。代わりに、私はシリアル化された値を格納します。EF:NotMappedプロパティのnullableでないUpdateException

モデル:

public class Game 
{ 
    //... 
    [NotMapped] 
    public Image Image { get; set; } 

    [NotMapped] 
    public List<Image> Images { get; set; } 

    public string Image_Serialized 
    { 
     get 
     { 
      return JsonConvert.SerializeObject(Image); 
     } 
     set 
     { 
      Image = JsonConvert.DeserializeObject<Image>(value); 
     } 
    } 

    public string Images_Serialized 
    { 
     get 
     { 
      return JsonConvert.SerializeObject(Images); 
     } 
     set 
     { 
      Images = JsonConvert.DeserializeObject<List<Image>>(value); 
     } 
    } 
    //... 
} 

そして...

public class Image 
{ 
    public string IconUrl { get; set; } 
    public string MediumUrl { get; set; } 
    public string ScreenUrl { get; set; } 
    public string SmallUrl { get; set; } 
    public string SuperUrl { get; set; } 
    public string ThumbUrl { get; set; } 
    public string TinyUrl { get; set; } 
} 

私の同期が完了すると、私は自分のデータベースを更新:

foreach(var game in games) 
{ 
    // address any null complex types. 
    if (game.Image == null) game.Image = new Image(); 
    if (game.Images == null) game.Images = new List<Image>(); 

    // add game if new, update if already in db 
    var dbGame = db.Games.Where(g => g.Id == game.Id).FirstOrDefault(); 

    if (dbGame == null) 
    { 
     db.Games.Add(game); 
    } 
    else 
    { 
     var queriedGame = db.Entry(dbGame); 
     queriedGame.CurrentValues.SetValues(game); 
     queriedGame.State = System.Data.Entity.EntityState.Modified; 
    } 

} 

// returns 0 results... seems fine 
var badGames = games.Where(g => g.Image == null || g.Images == null).ToList(); 

db.SaveChanges(); 

私はデシベルで次の例外を受け取ります。 SaveChanges():

Server Error in '/' Application. 

Null value for non-nullable member. Member: 'Image'. 

ありがとうございました。さらに、値がdb(NotMapped属性)に直接格納されることを期待していない場合、これらの値がnullであることを心配する必要があるのはなぜですか?

+0

イメージをシリアル化された文字列として保存し、次にゲームオブジェクトのイメージIDを保存する理由は何ですか? –

+0

列の画像があるゲームテーブルを確認しますか? –

+0

@AliBaigこれは何が起きているかではありません。注目の画像と関連画像のリストがあります。これらはすべて、外部サーバー上のイメージにリンクするURLです。注目画像は必ずしも関連リストに存在するとは限りません。 –

答えて

0

おそらくImage?イメージの代わりにデータ型を使用します。

+0

もっと具体的になりますか?私は従わない...画像は、私が作成した抽象的なデータ型です。 –

+0

null可能な型については、C#で知っていますか? ここでドキュメントをチェックしてください。https://msdn.microsoft.com/en-us/library/1t3y8s4s.aspx –

+0

はい、null可能な型はnull可能ではないオブジェクト(構造体、プリミティブなど)を対象としています。これは、本質的にはnull可能なオブジェクトです。それが私をここに助けてくれるかどうかはわかりません。あなたは説明できますか? –

1

あなたのゲームクラスには画像のICollectionの画像IDを持つ代わりに、そのようなモデルを使用することをお勧めしません。

は、現在のモデルで、あなたは正しい方向に私を送るためにアリに

public class Game 
{ 
    //... 
    [NotMapped] 
    public Image? Image { get; set; } //<== see ? to make it nullable 

    [NotMapped] 
    public List<Image> Images { get; set; } 

    public string Image_Serialized 
    { 
     get 
     { 
      if(Image == null) 
       return null; 
      return JsonConvert.SerializeObject(Image); 
     } 
     set 
     { 
      if(value == null) 
       Image = null; 
      else 
       Image = JsonConvert.DeserializeObject<Image>(value); 
     } 
    } 
} 
+0

私はこれを撃つでしょう。イメージがデフォルトでnullにできないのはなぜですか?それはオブジェクトです。これは単にEFが理解する装飾ですか? よく質問されています - イメージがNotMappedのときにnullの場合、エンティティフレームワークが気になるのはなぜですか? –

+0

イメージは現在オブジェクトです。つまり、定義によってすでにnull可能です。追加?装飾は私に "画像はnull値ではない値の型でなければならない"というエラーを出します。これは、私が構造体(nullableでない型)を使用する必要があります。私はそれを試みることができますが、私はこれのために別の人の図書館を利用しています。私は彼のオブジェクトを構造体に変更したくないと思っています。 –

0

1のような何かを試すことができますことを言いました。

Imageを構造体に変更し、Image参照をnullにすると、同じエラーが発生しました。問題は、Gameオブジェクトが他の多くのオブジェクトタイプ(Developer、Publisher、Releaseなど)を参照していたことでした。これらのオブジェクトの中には、まだNotMappedに設定していなかったイメージ参照があります。私の仮説は、db.SaveChanges()を呼び出すと、これらのデータテーブルにエントリを追加しようとしていて、問題を引き起こしていたということです。

関連する問題