Отображать страницу ошибки в ASP.NET MVC, когда пользователь пытается удалить объект с ограничениями внешнего ключа?

1

Я действительно новичок в ASP.NET MVC и Entity Framework, и это дает мне столько головных болей. Я прошел через все подобные вопросы, и я вышел пустым. Я не могу найти хорошие ресурсы для обработки ошибок ASP.NET MVC!

Вот мои модели:

namespace ServerManager.Models
{
    public class Domain
    {
        public Domain()
        {
            this.Id = Guid.NewGuid();
            this.Servers = new HashSet<Server>();
        }

        [Key]
        [Required]
        public Guid Id { get; set; }

        [Required]
        [Display(Name="Domain Name")]
        public string Name { get; set; }

        [Required]
        [Display(Name="Fully-Qualified Name")]
        public string FullyQualifiedName { get; set; }

        [Display(Name="Servers")]
        public virtual ICollection<Server> Servers { get; set; }
    }

    public class Server
    {
        public Server()
        {
            this.Id = Guid.NewGuid();
        }

        [Required]
        [StringLength(25)]
        [Display(Name="Server Name")]
        public string Name { get; set; }

        public virtual Domain Domain { get; set; }

        [Required]
        [Display(Name = "Domain")]
        public virtual Guid DomainId { get; set; }
    }
}

Я ищу, чтобы иметь доступ к свойству Server.Domain для Server.Domain доступа к Domain для объекта Server с которым я работаю (что работает), и, наоборот, я ищу доступ к свойству Domain.Servers (какой тип работает). Проблема в том, что когда я удаляю объект Domain с использованием DbContext, происходит каскадное удаление. Желаемый эффект, который я собираюсь сделать, заключается в том, чтобы не позволить пользователю удалять объект Domain то время как все еще есть объекты Server с использованием Domain. Как я могу достичь этого без отображения общего сообщения об ошибке?

  • 0
    В своем классе контекста вы можете переопределить метод OnModelCreating и установить параметры каскада. Некоторые статьи здесь , здесь и здесь
  • 0
    Да приятель. Как указывалось в вопросе, я просмотрел все эти ссылки раньше, и в итоге Fluent доставил мне больше проблем. Возможно, я еще не до конца понимаю, как отобразить отношения, используя Fluent, так что, возможно, я смогу взглянуть на это немного подробнее.
Показать ещё 1 комментарий
Теги:
entity-framework
asp.net-mvc

1 ответ

1
Лучший ответ

Скажем, вы пишете такой запрос, чтобы найти объект Domain:

Guid id = Guid.Parse("...");
Domain domain = db.Domains.Find(id);

Вы можете написать другой запрос, чтобы определить, есть ли у него какие-либо серверы:

bool hasServers = db.Servers.Any(s => s.DomainId == domain.Id);

Вы также можете объединить его в один запрос:

var domainAndServers = db.Domains.Include("Servers").SingleOrDefault(d => d.Id == id);

Или что-то вроде этого:

var domainAndServerCount = from d in db.Domains
                           where d.Id == id
                           select new
                           {
                               Domain = d,
                               ServerCount = d.Servers.Count()
                           };

Вы можете использовать эти свойства, чтобы заполнить свою модель просмотра, можно ли разрешить удаление или нет:

DomainViewModel vm = new DomainViewModel();
vm.CanBeDeleted = hasServers;
// or
vm.CanBeDeleted = domain.Servers.Count() > 0;

Domain.Servers.Count()> 0 будет работать, если у вас есть ленивая загрузка, поэтому вам необязательно писать свой запрос с помощью Include.

  • 0
    Если честно, ты совершенно прав! Я слишком усложнял это в своей голове. Как примечание, я также обновил действие POST для Delete, чтобы оно NotSupportedException если domain.Servers.Count() больше 0. Таким образом, вы не можете отправить POST-запрос на удаление домена, что приведет к каскадному удалению.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню