2016-10-20 10 views
1

単純に、タイプリスト(i.e. Items)のコレクションを反復処理することによって、学生をデータベースに追加しています。項目は強くここに入力されません。私はこれをどこかから手に入れています。だから、私はそれをSQLに書き込む前にそれからStudentオブジェクトを構築する必要があります。それは学生情報を持っています。イテレータ内にエンティティを保存するときにエラーが発生する

すべてのフィールドの検証が正常であれば、問題なく動作します。

ただし、リストの最初の項目に検証エラー(i.e. Age required field in Student model)があると、エラーが発生します。しかし、2番目の項目の有効な年齢の値を持っていますが、それでも前の項目の検証エラーが表示されます。

try 
{ 
    foreach (var item in Items) 
    { 
     Student student = new Student 
     { 
      StudentId = item.Id, 
      Age = item.Age, 
      Description = item.Description 
     }; 

     _context.Student.Add(student); 
     _context.SaveChanges(); 
    } 
}  
catch (MyCustomValidationException ex) 
{ 
    //// catch it and log it 
} 

コンテキストに関連付けられている最初のアイテムに関連するものはありますか。 どうすればそれを取り除くことができますか?すべて私はDBにアイテムを保存したいのですが、リストを反復して検証をパスします。

アイテム

public class Items 
{ 
    public string Id {get;set;} 
    public string Age {get; set;} 
    public string Description {get;set;} 
} 

これは、それはあなたがあなたのループ内で変更内容を保存してはならないすべての

items.Add(
new Items 
{ 
new Items {Id = 1, Age = null, Description = "ABC"}, 
new Items {Id = 1, Age = 12, Description = "ABC"} 
} 
) 
+1

「アイテム」には何がありますか?エラーは何ですか? – dotctor

+0

私が言ったようなアイテムは 'コレクションのタイプリスト'です。それは学生情報を持っています。エラー。年齢は私のモデルの必須フィールドです。最初の反復でAgeがnullの場合、検証エラーが発生します。これは問題ありません。しかし、2回目の反復では、私はAgeを持っていますが、EFはAgeの要求を続けています。 – simbada

+0

_contextクラスのコードも投稿できますか?あなたは通常、.Studentの代わりに_context.Studentsを使用します。これはセットであることを示します(レコードを意味します) – peval27

答えて

1

問題は、フィールドAgeStudentにありますが、nullの値を指定していて、データベースに挿入できません。

データベースに挿入するデータを検証する必要があります。

foreach (var item in Items) 
{ 
    Student student = new Student 
    { 
     StudentId = item.Id, 
     Age = item.Age, 
     Description = item.Description 
    }; 

    if (student.IsValid()) 
    { 
     _context.Student.Add(student); 
    } // else do something with invalid data! maybe warn user or log it ... 
} 
_context.SaveChanges(); 

Studentクラス何が起こる

public bool IsValid() 
{ 
    if (string.IsNullOrWhiteSpace(this.Age)) 
    { 
     return false; 
    } 

    return true; 
} 

IsValidを追加する??

無効なStudentをコンテキストに追加するには、_context.Student.Add(student);を呼び出します。 _context.SaveChanges();に電話するたびに、Studentをデータベースに挿入しようとします。無効なStudentを削除するまでエラーが発生します。 SaveChangesに電話するとよいでしょう。なぜなら、それを呼び出すたびにデータベースにヒットし、余分なオーバーヘッドが加わるからです。ただし、SaveChanges()を呼び出して妥当性を1つずつ確認したい場合は、例外を取得することができます。

foreach (var item in Items) 
{ 
    Student student = new Student 
    { 
     StudentId = item.Id, 
     Age = item.Age, 
     Description = item.Description 
    }; 

    _context.Student.Add(student); 

    try 
    { 
     _context.SaveChanges(); 
    } 
    catch (MyCustomValidationException ex) 
    { 
     _context.Student.Remove(student); 
    } 
} 
2

まず移入され、それは代わりに1のデータベースに複数のINSERTクエリの原因になります方法です。

第2に、検証例外がスローされ、あなたのループforeachから外れるため、コードが不完全だと思います。しかし、あなたの周りのtry/catchを持っていても、あなたのコンテキストにまだ無効なデータが残っているという事実を取り消さないで、_context.SaveChanges()を再度呼び出すと、Studentテーブルのこれらの変更をもう一度コミットしようとします。あなたの質問からは明らかではありませんが、私はあなたが学生の年齢のDB側の検証を持っていると仮定します。

+0

あなたは私の問題を正確に得ています。私はsaveChangesの周りをキャッチしようとしています。それは妥当性検査のエラーをキャッチしますが、2回目の反復に戻ると、それはまだ妥当性検査のエラーに対して不平を言う。だから、解決策は何ですか?どのように私はそれを解決すべきですか? – simbada

+0

解決策は、無効なモデルをコンテキストに追加したり、データベースに何かを追加したり、例外を適切に処理したりする前に、検証レイヤーをロジックに追加したり、無効なモデルをコンテキストから削除したりすることではありません。 –

+0

「コンテキストから無効なモデルを削除する」と正確に検索していました。あなたは共有するための参照がありますか? – simbada

関連する問題