Как я могу определить столбец Entity, чтобы он имел значение по умолчанию при создании, но мог быть перезаписан с помощью Entity Framwork? - PullRequest
0 голосов
/ 31 мая 2018

В моей таблице Users есть столбец с именем CreatedOn, для которого "Значение по умолчанию или привязка" установлено на (getdate()).В моем файле .edmx для этой модели я определил этот столбец как <Property Name="CreatedOn" Type="datetime2" Precision="7" Nullable="false" StoreGeneratedPattern="Computed"/>.

  • Преимущество: поле устанавливается как текущая временная метка при создании
  • Недостаток: я не могу изменить поле с помощью Entity Framework

Я могуоднако измените определение поля в файле .edmx на StoreGeneratedPattern="None", что дает мне:

  • Преимущество: я могу изменить поле в любое время после создания с помощью Entity Framework
  • Недостаток: поле не устанавливается как текущая временная метка при создании

Проблема заключается в том, что Entity Framework, когда я задаю StoredGeneratedPattern="None" для этого столбца в файле .edmx, вместо того, чтобы база данных установилаGETTIME () сама отправляет значение 0001-01-01 00:00:00, которое затем перезаписывает базу данных по умолчанию.Я знаю это по записи оператора SQL, который Entity отправляет: INSERT [dbo].[Users]([LoginName], [Password], ..., [CreatedOn]) VALUES (@0, @1, ..., @7) where @7 = '0001-01-01 00:00:00' (Type = DateTime2).

Что мне нужно сделать, чтобы получить это:

  • Преимущество: поле устанавливается как текущая временная метка при создании
  • Преимущество: я могу изменить значение этого поля в любое время после создания через Entity Framework

1 Ответ

0 голосов
/ 31 мая 2018

Вы можете использовать свой второй подход и уменьшить недостатки, установив CreatedOn в DateTime.Now перед сохранением в коде своего приложения.Таким образом, опора CreatedOn полностью управляется кодом приложения в приложении, но если User создается непосредственно в БД, ограничение по умолчанию вступает в силу.

Вот несколько способов приблизиться к настройке CreatedOn это можно использовать в зависимости от ситуации:

  1. Установите его перед сохранением, как и любое другое свойство.
  2. Как указано в комментариях ESG, установите его в параметре-less конструктор.
  3. Если вы используете слой абстракции поверх EF, как шаблон репозитория, вы можете создать абстрактный базовый класс или интерфейс, который содержит свойство CreatedOn и наследовать / реализовывать в любых классах.Вы хотите добавить эту опору в.Затем создайте метод сохранения базового репозитория, который проверяет, относятся ли сохраняемые объекты к типу, обладающему свойством CreatedOn, и, если да, задайте его перед сохранением.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...