2016-05-04 2 views
2

Я Субъект CandidateSaveChanges бросает ошибку проверки в течение цикла

public class Candidate 
{ 
    public int Id { get; set; } 

    [Required] 
    public string Name { get; set; } 

    public int Age { get; set; } 
} 

Теперь я список candidates и цикл I списка и сохранить каждую из них по отдельности. Теперь некоторые элементы из списка не соответствуют валидациям, указанным на модели Candidate.

var dbContext = new TestDbContext(); 

var list = new List<Candidate> 
{ 
    new Candidate { Name = "", Age = 20 }, 
    new Candidate { Name = "Tom" , Age = 25 } 
}; 


foreach (var item in list) 
{ 
    try 
    { 
      dbContext.Candidates.Add(item); 
      dbContext.SaveChanges(); 
    } 
    catch (Exception) 
    { 
      // Handle exception 
    } 
} 

Очевидно, что первый элемент будет подбросить Ошибка проверки т.е. требуется

Имя.

Но второй элемент в списке, очевидно, удовлетворяет требования валидации, но я еще раз получить Validation ошибку т.е. требуется

Имени.

Что я здесь делаю неправильно и почему код ведет себя так?

+1

когда вы добавляете элемент, он все еще находится в DbContext; удалите эти элементы в Catch, когда вы получите исключение – techspider

+0

Я должен сделать dbContext.Candidates.Remove (item) ??? –

+0

Я бы так подумал – techspider

ответ

1

Просто добавьте finally блок к вашему TryCatch как это:

try 
{ 
    dbContext.Candidates.Add(item); 
    dbContext.SaveChanges(); 
} 
catch (Exception) 
{ 
    // Handle exception 
} 
finally 
{ 
    dbContext.Candidates.Remove(item); 
} 
+0

Будет ли это выполнено? Я не пробовал, но я думаю, что вы должны вызвать SaveChanges после Remove(), не так ли? – hastrb

+0

@AliaksandrBortnik Ну * код внутри блока finally будет выполнен независимо от того, существует ли исключение *, поэтому, если вы вызываете 'SaveChanges' после' Remove', он также удаляет элементы из DB, которые правильно вставили в 'try 'block, и это не то, что мы хотим. Нам просто нужно удалить этот элемент из 'dbContext', чтобы блок catch не удалял исключение. –

+0

Правильно, имеет смысл. Очистка только для контекста. Не уверен в вашем плане, если он не был добавлен в контекст успешно. – hastrb

Смежные вопросы