entity.HasOne(d => d.CarNavigation)
.WithMany(p => p!.Orders)
.HasForeignKey(d => d.CarId)
.OnDelete(DeleteBehavior.ClientSetNull)
.HasConstraintName("FK_Orders_Inventory");
entity.HasOne(d => d.CustomerNavigation)
.WithMany(p => p!.Orders)
.HasForeignKey(d => d.CustomerId)
.OnDelete(DeleteBehavior.Cascade)
.HasConstraintName("FK_Orders_Customers");
});
Настройте фильтр для свойства CarNavigation
сущности Order
, чтобы отфильтровывать неуправляемые автомобили. Обратите внимание, что этот код находится не в том же блоке, где был предыдущий код. Никаких формальных причин разносить код не существует; просто здесь демонстрируется альтернативный синтаксис для конфигурирования в отдельных блоках:
modelBuilder.Entity
Сущность Car
Шаблонный класс содержит конфигурацию для класса Inventory
, который понадобится изменить на Car
. Свойство TimeStamp
нужно удалить, а в конфигурации навигационных свойств изменить имена свойств на MakeNavigation
и Cars
. Сущность получает фильтр запросов для отображения по умолчанию только управляемых автомобилей и устанавливает стандартное значение свойства IsDrivable
в true
. Код должен иметь следующий вид:
modelBuilder.Entity
{
entity.HasQueryFilter(c => c.IsDrivable);
entity.Property(p
=> p.IsDrivable).HasField("_isDrivable").HasDefaultValue(true);
entity.HasOne(d => d.MakeNavigation)
.WithMany(p => p.Cars)
.HasForeignKey(d => d.MakeId)
.OnDelete(DeleteBehavior.ClientSetNull)
.HasConstraintName("FK_Make_Inventory");
});
Специальные исключения
Распространенный прием для обработки исключений предусматривает перехват системного исключения (и/или исключения EF Core, как в текущем примере), его регистрацию в журнале и генерацию специального исключения. Если специальное исключение перехватывается вышерасположенным методом, то разработчику известно, что исключение уже было зарегистрировано в журнале, и необходимо только отреагировать на него надлежащим образом в коде.
Создайте в проекте AutoLot.Dal
новый каталог по имени Exceptions
и поместите в него четыре новых файла классов, CustomException.cs
, CustomConcurrencyException.cs
, CustomDbUpdateException.cs
и CustomRetryLimitExceededException.cs
, содержимое которых показано ниже:
// CustomException.cs
using System;
namespace AutoLot.Dal.Exceptions
{
public class CustomException : Exception
{
public CustomException() {}
public CustomException(string message) : base(message) { }
public CustomException(string message, Exception innerException)
: base(message, innerException) { }
}
}
// CustomConcurrencyException.cs
using Microsoft.EntityFrameworkCore;
namespace AutoLot.Dal.Exceptions
{
public class CustomConcurrencyException : CustomException
{
public CustomConcurrencyException() { }
public CustomConcurrencyException(string message) : base(message) { }
public CustomConcurrencyException(
string message, DbUpdateConcurrencyException innerException)
: base(message, innerException) { }
}
}
// CustomDbUpdateException.cs
using Microsoft.EntityFrameworkCore;
namespace AutoLot.Dal.Exceptions
{
public class CustomDbUpdateException : CustomException
{
public CustomDbUpdateException() { }