Является ли суть проекта, создание которого необходимо для проверки того, существует ли уже объект с тем же именем. При редактировании таких потребностей, как проверка, но имейте в виду, что можно сопоставить старое и новое имя объекта. Вам также необходимо отобразить сообщение об ошибке. Для этого я использую интерфейс IValidatableObject, но не знаю, как сказать метод Validate, который в данный момент редактируется или создается объект.Две проверки IValidatableObject в одном объекте
ответ
Проблема решена с использованием метода 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;
}
}
DbContext.ValidateEntity в качестве второго параметра принимает IDictionary<Object, Object> items
. Вы можете передать любые данные там, и данные, которые вы передадите, будут переданы в IValidatableObject.Validate
в ValidationContext.Items
Предполагая, что вы обратитесь к проверке 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. ЛОКАЛЬНОЕ ТОЛЬКО И БЛОК Просто легко.
Но в обоих ... Это ваше деловое решение.
- 1. IValidatableObject Context
- 2. Соедините две таблицы в одном объекте java от jpa
- 3. IValidatableObject в отдельных сборках
- 4. Различные правила проверки на одном объекте в Symfony2
- 5. Может две нити никогда не действовать на одном объекте одновременно
- 6. Как использовать IValidatableObject?
- 7. Две проверки равенства в одном Где или наоборот для эффективности
- 8. Метод проверки в IValidatableObject не возвращает ValidationResult во всех сценариях
- 9. Две функции в одном
- 10. Реализация IValidatableObject не работает
- 11. MVC Пользовательская проверка: DataAnnotations или IValidatableObject?
- 12. IValidatableObject Validate() для различных сценариев
- 13. Рекурсивная проверка с использованием аннотаций и IValidatableObject
- 14. Несколько списков в одном объекте
- 15. действуют на одном объекте
- 16. IValidatableObject в MVC3 - проверка на стороне клиента
- 17. весна форма проверки в объекте
- 18. Две таблицы в одном QTableView
- 19. Twig две петли в одном
- 20. Две операции в одном перенаправлении
- 21. Высушите две константы в одном
- 22. Две функции в одном вызове
- 23. Объедините две таблицы в одном
- 24. две модели в одном действии
- 25. Две таблицы в одном (java)
- 26. Две установки в одном домене?
- 27. Две сумма в одном запросе
- 28. Две панели в одном JFrame
- 29. Две переменные в одном цикле
- 30. IDataErrorInfo vs IValidatableObject?