2016-10-20 13 views
1

Я просто добавляю ученика в базу данных, итерируя через набор списка типов (i.e. Items). Элементы здесь строго не указаны. Я получаю это из другого места. Поэтому мне нужно построить объект Student из него, прежде чем записывать его в SQL. У него есть студенческая информация.получение ошибки при сохранении объекта внутри итератора

Это работает отлично для меня, пока все проверки полей в порядке.

Однако, если первый элемент в списке имеет ошибку проверки (i.e. Age required field in Student model), я получаю ошибку, которая в порядке. Но для второго элемента у меня есть действительное значение по возрасту, но все еще получаю ошибку проверки для предыдущего элемента.

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 
} 

Это что-то связанное с первым пунктом, все еще связанным с контекстом? Как я могу избавиться от этого? Все, что я хочу сохранить элементы в БД, итерации по списку, в зависимости от проверки.

Предметы

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

Что находится в 'Items'? Какая ошибка? – dotctor

+0

Элементы, как я сказал, это «Коллекция списка типов». У него есть студенческая информация. Ошибка. Возраст требует поля в моей модели. Если Age на первой итерации равно null, я получаю ошибку проверки, которая в порядке.Но для второй итерации у меня есть возраст, но EF все еще продолжает говорить, что требует Age. – simbada

+0

Вы также можете отправить код для класса _context? Кстати, вы обычно используете _context.Students вместо .Student, указывая, что это набор (что означает записи) – peval27

ответ

1

Проблема заключается в том, что у вас есть обязательное поле Age в Student, но вы предоставляете значение 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(); 

добавить IsValid к Student класса

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

    return true; 
} 

Что происходит ??

Вы добавляете недопустимый Student в контекст, вызывая _context.Student.Add(student);. Каждый раз, когда вы вызываете _context.SaveChanges();, он пытается добавить в базу данных Student. Вы получите ошибку, пока не удалите недопустимый Student. Не рекомендуется звонить SaveChanges, потому что каждый раз, когда вы его вызываете, он попадает в базу данных и добавляет дополнительные накладные расходы. Однако, если вы хотите проверить действительность один за другим, вызвав SaveChanges() и получить исключение, вы можете попробовать это.

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

Прежде всего, вы не должны сохранить изменения внутри цикла, то это вызовет множество запросов вставки в базу данных вместо одного ,

Во-вторых, я считаю, что ваш код является неполным, так как исключение проверки будет выбрано, и вы не пройдете цикл foreach. Но даже если у вас есть попытка/улов вокруг вашего _context.SaveChanges(), он не отменяет тот факт, что у вас все еще есть недопустимые данные в вашем контексте, а вызов _context.SaveChanges() второй раз попытается зафиксировать эти изменения для таблицы Student. Это не ясно из вашего вопроса, но я предполагаю, что у вас есть проверка на стороне БД для возраста Студента.

+0

Вы точно получаете мою проблему. У меня есть Try Catch вокруг saveChanges. Он ломает ошибку проверки, но при возврате на вторую итерацию он все еще жалуется на ошибку проверки. Так в чем же решение? Как мне это решить? – simbada

+0

Решение состоит в том, чтобы не добавлять недопустимые модели в ваш контекст, добавить уровень проверки в свою логику, прежде чем добавлять что-то в базу данных или правильно обрабатывать исключение и удалять из контекста недопустимые модели. –

+0

Я искал точно «удалить недопустимые модели из контекста». у вас есть ссылка на долю? – simbada

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