#sql #.net-core #entity-framework-core #calculated-columns #ef-model-first
#sql #.net-core #entity-framework-core #вычисляемые столбцы #ef-модель-первая
Вопрос:
У меня есть следующая (упрощенная) таблица
public class Door
{
public int Id { get; set; }
public bool Locked { get; set; }
}
Теперь проблема с этой таблицей заключается в том, что я не знаю, как долго дверь была заперта или нет. Я мог бы добавить новый столбец даты и времени, но тогда, если дверь была заблокирована, открыта и снова заблокирована, я бы не знал точно, когда она была заблокирована в первый раз, так как это было бы перезаписано. Итак, я добавил новую таблицу
public class Locks
{
public int Id { get; set; }
public int DoorId { get; set; }
public virtual Door Door { get; set; }
public DateTime? LockedFrom { get; set; }
public DateTime? LockedTo { get; set; }
}
и добавил a public Collection<Locks>
в мою таблицу Door. Это все хорошо и хорошо, и решило бы мою первую проблему. Однако дверь и дверь.Locked широко используется во всем нашем коде, и изменение всех этих запросов было бы очень большой работой. Итак, я надеялся, что смогу переписать Door.Заблокирован, чтобы быть вычисляемым столбцом. Он должен собирать записи для этой двери из Locks и сравнивать их даты и время с текущим временем, чтобы выяснить, заперта ли дверь прямо сейчас. Важно, чтобы это был вычисляемый столбец (обрабатываемый на стороне сервера), а не функция или вычисляемый параметр в сущности, поскольку это вызвало бы все запросы, которые фильтруют Door.Заблокирован для обработки в памяти (и у меня есть множество дверей в моей БД). Я бы также предпочел, если дверь.Заблокированный может быть не обнуляемым, чтобы избежать изменения его типа на Bool?, и это, по-видимому, возможно, если сделать столбец сохраненным. Я видел примеры вычисляемых столбцов в .NET Core, где они используются entityTypeBuilder.Property(x => x.Locked).HasComputedColumnSql("some sql formula")
, но ни один из них не делает этого, когда формула зависит от содержимого другой таблицы.
Вывод: сначала я хочу создать код вычисляемого столбца, который вычисляет его значение, используя содержимое другой таблицы.
Спасибо!
Комментарии:
1. Конечно, в SQL Server вычисляемые столбцы ограничены только данными в одной строке одной таблицы.
2. Вы можете преодолеть это ограничение, вызвав пользовательскую функцию со скалярным значением в вычисляемом столбце, но SQL server не сможет включить код функции в план запроса, поэтому обычно это плохо сказывается на производительности.