2

Является ли суть проекта, создание которого необходимо для проверки того, существует ли уже объект с тем же именем. При редактировании таких потребностей, как проверка, но имейте в виду, что можно сопоставить старое и новое имя объекта. Вам также необходимо отобразить сообщение об ошибке. Для этого я использую интерфейс IValidatableObject, но не знаю, как сказать метод Validate, который в данный момент редактируется или создается объект.Две проверки IValidatableObject в одном объекте

ответ

0

Проблема решена с использованием метода ModelState.AddModelError (строка, строка) в действиях Edit and Create.

[HttpPost] 
[HandleError(View="AjaxError")] 
public ActionResult Edit(ProjectsViewData data) 
{ 
    if (ModelState.IsValid) 
    { 
     if (!ContainsProject(data.CurrentObject.Name)) 
     { 
      db.Projects.Attach(data.CurrentObject); 
      db.ObjectStateManager.ChangeObjectState(data.CurrentObject, EntityState.Modified); 
      db.SaveChanges(); 
      return Projects(data); 
     } 
     else 
     { 
      int projectId = (from p in db.Projects 
           where p.Name == data.CurrentObject.Name 
           select p.ProjectID).FirstOrDefault(); 
      if (projectId == data.CurrentObject.ProjectID) 
      { 
       db.Projects.Attach(data.CurrentObject); 
       db.ObjectStateManager.ChangeObjectState(data.CurrentObject, EntityState.Modified); 
       db.SaveChanges(); 
       return Projects(data); 
      } 
      else 
      { 
       ModelState.AddModelError("Name", Localizer.ProjectAlreadyExists); 
      } 
     } 
    } 

    data.ObjectToEdit = data.CurrentObject; 
    return Projects(data); 
} 

[HttpPost] 
[HandleError(View = "AjaxError")] 
public ActionResult Create(ProjectsViewData data) 
{ 
    if (ModelState.IsValid) 
    { 
     if (!ContainsProject(data.CurrentObject.Name)) 
     { 
      db.Projects.AddObject(data.CurrentObject); 
      db.SaveChanges(); 
      return Projects(data); 
     } 
     else 
     { 
      ModelState.AddModelError("Name", Localizer.ProjectAlreadyExists); 
     } 
    } 

    data.ObjectToAdd = data.CurrentObject; 
    return Projects(data); 
} 

Вспомогательный метод:

private bool ContainsProject(string projectName) 
{ 
    if (projectName != null) 
    { 
     projectName = Regex.Replace(projectName.Trim(), "\\s+", " "); 
     List<string> projects = new List<string>(); 
     var projectNames = (from p in db.Projects 
          select p.Name.Trim()).ToList(); 
     foreach (string p in projectNames) 
     { 
      projects.Add(Regex.Replace(p, "\\s+", " ")); 
     } 
     if (projects.Contains(projectName)) 
     { 
      return true; 
     } 
     else 
     { 
      return false; 
     } 
    } 
    else 
    { 
     return false; 
    } 
} 
0

DbContext.ValidateEntity в качестве второго параметра принимает IDictionary<Object, Object> items. Вы можете передать любые данные там, и данные, которые вы передадите, будут переданы в IValidatableObject.Validate в ValidationContext.Items

0

Предполагая, что вы обратитесь к проверке EF can not do для вас.
Это действительно сложно проверить. Вы проверяете объект после его добавления в контекст. Он не должен проверять себя и должен учитывать другие элементы в контексте, которые еще не сохранены. Как и БД. Существует несколько комбинаций плюс самовосприятие. Запишите запись объекта в LOCAL, когда ID пуст/новый, т.е. несколько новых вставок нуждаются в тщательном кодировании. (Рассмотрите возможность использования идентификаторов временных)

в еще не были сохранены записи должны быть в контексте

Context.Set<TPoco>().Local 

и получить данные из БД и сохранить в списке темп. НО не вписывайтесь в контекст. Или используйте ВТОРОЙ контекст.

var matchingSet = Context.Set<TPoco>().AsNoTracking() // not into context... 
         .Where(t=>t.field == somevalue).ToList(); 

А как насчет логических и фактических дубликатов в БД. Логические дубликаты - это дубликаты в поле без уникального индекса, который с точки зрения бизнеса должен быть уникальным.

Если вы хотите, чтобы проверить те ...

Вы должны прочитать DB .... НО если эти записи в настоящее время изменились, вы не можете просто положить их в контекст. Вы бы перезаписали их. Но что, если значения, измененные значения логических ключей? Что-то вызвало логический дубликат записи в БД, возможно, больше не будет дублироваться после сохранения или наоборот. Это все еще дуп или нет?

Итак, вам нужно решить, как вы соответствуете ЛОКАЛЬНЫМ и загруженным записям. Т.е. проверьте LOCAL и соответствующие записи DB и decidr, что делать, если запись находится в обоих, только локальная или только db. ЛОКАЛЬНОЕ ТОЛЬКО И БЛОК Просто легко.
Но в обоих ... Это ваше деловое решение.

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