2012-05-29 7 views
2

Я создал одну сущность под названием «Item». Он получил Id, CreateDate и ModifyDate вместе с некоторыми требуемыми данными.EF Code First - Identity & Computed column

Я использую EF 4.3 Code First model. Я в порядке, чтобы перейти с последней версией EF, если она решит мою проблему.

Все эти три значения являются необязательными. Иногда я могу передать некоторые значения: Id или CreateDate. Я хочу, чтобы EF автоматически генерировал эти значения из БД, если я не прохожу, иначе возьмите тот, который я прошел.

До сих пор я нашел: если я создаю столбец Идентификатор как столбец Identity, то он игнорирует предоставленные значения, то же самое верно для вычисленного столбца.

В любом случае у меня будет опция для доставки этих значений?

Ещё одна вещь, у меня есть изменение даты поле. Я хочу, чтобы DB обновляла текущее время, когда я обновляю запись. Я нашел следующие варианты, но почему-то мне не удобно с кем-то из них. Есть ли какой-либо прямой вариант из БД (что-то вроде значения по умолчанию)?

  1. Используйте триггер Update, чтобы обновить ModifyDate
  2. Установите значение ModifyDate на C# стороне

Моя сущность:

public class Item 
{ 
    public Guid? ItemId { get; set; } 

    public string SomeData { get; set; } 

    public DateTime CreateDate { get; set; } 

    public DateTime? ModifyDate { get; set; } 
} 

ответ

0
  • Вы можете установить значения по умолчанию в конструкторе от Item.
  • Для дат модификации я всегда использовал триггер базы данных, потому что вы не хотите зависеть от часов на разных машинах.
+0

Да, мы можем сделать это с помощью конструктора, но я хочу получить его из БД по той же причине, о которой вы говорили позже, которая хочет зависеть от часов БД, а не от разных машин. – Hitesh

+0

Да, конечно. ItemId все еще может быть установлен конструктором и создать дату с помощью триггера insert. –

2

Все эти три значения являются необязательными. Иногда я могу передать некоторые значения say Id или CreateDate. Я хочу, чтобы EF автоматически генерировал это значение из БД, если я не пройду, иначе возьмите тот, который я прошел.

Это невозможно в EF. EF поддерживает только два механизма:

  • Значение всегда обеспечивается приложением
  • Значение всегда представленной в базе данных с использованием либо идентичности или вычисляемых установки

Причиной является способ, как значения по умолчанию обрабатываются базой данных. Они используются только в том случае, если команда INSERT не задает столбец явно, но EF всегда задает все столбцы явно (даже если вы не установили значение, поскольку используется значение по умолчанию .NET), за исключением столбцов с идентификацией или вычисленными параметрами.

Так третий механизм необходим для сценария:

  • Установить значения по умолчанию с триггером, если они не присутствуют или содержат.NET значение по умолчанию

Проблема в том, что без маркировки свойств, вычисленных или идентифицированных, вы не получите эти значения обратно автоматически. Если вы вставляете новую запись или обновляете существующую запись, экземпляр вашего объекта по-прежнему будет содержать старые значения (или значения по умолчанию .NET), если только вы не запустили новый запрос в базу данных для обновления текущего объекта. Вот почему существуют идентичные и вычисленные настройки - чтобы вернуть эти значения во время вставки или обновления автоматически.

Когда вы используете EF, все эти изменения должны быть сделаны в вашем приложении, а не в базе данных с помощью триггеров.

Смежные вопросы