Подтвердить что ты не робот

Как управлять GetDate() с помощью Entity Framework

У меня есть столбец, подобный этому в 1 из моих таблиц базы данных

DateCreated, datetime, default(GetDate()), not null

Я пытаюсь использовать Entity Framework для вставки в эту таблицу, как это...

        PlaygroundEntities context = new PlaygroundEntities();

        Person p = new Person
        {
            Status = PersonStatus.Alive,
            BirthDate = new DateTime(1982,3,18),
            Name = "Joe Smith"
        };

        context.AddToPeople(p);
        context.SaveChanges();

Когда я запускаю этот код, я получаю следующую ошибку

The conversion of a datetime2 data type to a datetime data type resulted in an out-of-range value.\r\nThe statement has been terminated.

Итак, я попытался настроить StoreGeneratedPattern на вычисление... то же самое, то личность... то же самое. Любые идеи?

4b9b3361

Ответ 2

Вам нужно вручную отредактировать XML файл edmx и установить атрибуты SSDL StoreGeneratedPattern для идентификации или вычисления. Но всякий раз, когда вы обновляете edmx через дизайнера, ваши изменения будут перезаписаны.

Это известная проблема. Для получения дополнительной информации см. Следующие ссылки:

Microsoft Connect Ticket

Использование GUID как EntityKey в Entity Framework 4

Ответ 3

У меня была такая же проблема! Для меня это работает следующим образом:

База данных MS SQL Server express:

[RowTime]  [datetime2](7)  NOT NULL

ALTER TABLE [dbo].[Table_1] ADD  CONSTRAINT [DF_Table_1_RowTime]  DEFAULT (getdate()) FOR [RowTime]
GO

Затем я импортирую таблицу из базы данных в модель Entities. Объекты не будут понимать значение по умолчанию! Таким образом, вы должны установить StoreGeneratedPattern столбца для вычисления. Тогда Entities больше не добавят значения по умолчанию.

Сочетание:

datetime2,
NOT NULL, 
StoreGeneratedPattern=Computed

Работает для меня!

Ответ 4

Вот рабочий способ:

1) Измените столбец на datetime2, как указано в другом месте. Это исправляет ошибку преобразования.

2) Добавьте триггер, который устанавливает DateCreated для getdate();

CREATE TRIGGER [TR_AS_ChangeTime] ON [AS_ApplicationSession] 
  AFTER INSERT,UPDATE AS
BEGIN

  SET NOCOUNT ON;
  UPDATE AS_ApplicationSession 
  SET AS_ChangeTime = getdate() 
  WHERE AS_Id IN(SELECT AS_ID FROM INSERTED)

END

3) Если необходимо, установите

p.DateCreated = DateTime.MinValue;

чтобы инициализировать его.

4) Если вам нужна DateCreated из базы данных, добавьте

context.Refresh(System.Data.Objects.RefreshMode.StoreWins, p);

сразу после

context.SaveChanges();

Ответ 5

Сосредоточившись на том, что я не хочу менять базу данных, поскольку это проблема приложения, и я ожидаю, что они однажды разрешат эту проблему, мое решение (что вполне возможно в моем случае) заключается в создании частичного класса модели для исправления проблемы в конструкторе:

public partial class Log
{
    public Log()
    {
        this.Date = DateTime.Now;
    }
}

Это работает для меня, потому что:

  • Я создаю модель в момент отправки ее в базу данных.
  • Я использую CLOUD для этих сервисов, дата-время должно быть одинаковым на серверах приложений и баз данных!

Не забывайте, что пространство имен должно совпадать с пространством имен модели или частичным, но не должно перечислять свойства (и также не должно быть частичным;])!