Я действительно новичок в 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
. Как я могу достичь этого без отображения общего сообщения об ошибке?
Скажем, вы пишете такой запрос, чтобы найти объект 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.
NotSupportedException
если domain.Servers.Count()
больше 0. Таким образом, вы не можете отправить POST-запрос на удаление домена, что приведет к каскадному удалению.