Как управлять GetDate () с Entity Framework - PullRequest
19 голосов
/ 30 апреля 2010

У меня есть такой столбец в 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 для вычислений ... то же самое, затем идентичность ... то же самое. Есть идеи?

Ответы [ 5 ]

9 голосов
/ 30 июня 2010

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

Это известная проблема. Пожалуйста, смотрите следующие ссылки для более подробной информации:

Microsoft Connect Ticket

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

4 голосов
/ 10 июля 2012

У меня была такая же проблема! Для меня это работает так:

База данных 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 столбца в Computed. Тогда сущности больше не будут помещать туда значения по умолчанию.

Сочетание:

datetime2,
NOT NULL, 
StoreGeneratedPattern=Computed

У меня работает!

2 голосов
/ 25 ноября 2010

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

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();
2 голосов
/ 30 апреля 2010

Изменение типа DateCreated на datetime2 может решить проблему.

datetime 2007-05-08 12: 35: 29.123

datetime2 2007-05-08 12:35:29. 12345

Ссылка: http://technet.microsoft.com/en-us/library/bb677335.aspx67

1 голос
/ 24 марта 2015

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...