Возьмите следующий класс EF:
public class Person
{
public int ID { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public IEnumerable<Property> Property { get; set; }
}
public class Property
{
public int ID { get; set; }
public string Name { get; set; }
public bool Lock { get; set; }
public Person Person { get; set; }
public int PersonID
}
Я могу в значительной степени заставить все работать как положено - включая действие удаления для Person, которое также удаляет все их свойства.Однако, поскольку мой код усложняется, я хочу сделать логику немного более продвинутой.
В приведенном выше примере у нас есть что-то еще, что установит bool lock для свойства.В этом случае я хочу отключить удаление для пользователя, когда любое свойство для этого человека имеет блокировку true.
Код контроллера удаления по умолчанию имеет:
public async Task<IActionResult> Delete(int? id)
{
if (id == null)
{
return NotFound();
}
var person = await _context.People
.FirstOrDefaultAsync(m => m.ID == id);
if (person== null)
{
return NotFound();
}
return View(person);
}
И подтверждение удаления имеет:
public async Task<IActionResult> DeleteConfirmed(int id)
{
var person= await _context.people.FindAsync(id);
_context.people.Remove(person);
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
Я знаю код для выполнения того, что я хочу:
foreach (var item in person.Property)
{
if item.locked==true
return("error")
}
Теперь веселые звезды!- Старое виртуальное ключевое слово EF4 для свойств, к которым я привык, не работает, поэтому я не могу перебрать свойство, потому что оно в настоящее время равно нулю.в большинстве случаев мне приходится звонить .include()
При первом удалении это изменяет:
var person = await _context.People
.FirstOrDefaultAsync(m => m.ID == id);
на
var person = await _context.People.Include(x=>x.property)
.FirstOrDefaultAsync(m => m.ID == id);
, что, кажется, работает нормально.
Однако второе:
var person = await _context.people.FindAsync(id);
, похоже, не работает.В тот момент, когда я вставляю .Include
, он сообщает об ошибке CS1061, что для FindAsync нет определения.
Честно говоря, я не слишком уверен, зачем нужны два разных способа просмотра идентификатораво-первых ... Я могу только предположить, что при поиске идентификатора в первом удалении, который может не существовать, firstordefault
является лучшим, а при подтверждении удаления, find
является лучшим .... однако этоэто то, что делает строительные леса, и я не чувствую, что знаю достаточно, чтобы подвергнуть сомнению это.
Я, однако, хочу быть лучшим разработчиком и хотел бы понять, что не так с кодом и в будущем, как мне это сделать?знаю, что можно комбинировать, а что нет, поскольку я не чувствую, что я здесь учусь, я просто случайным образом пробую разные вещи, пока не найду одну работающую комбинацию.