Ответ 1
Изменение типа DateCreated to 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 из моих таблиц базы данных
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 на вычисление... то же самое, то личность... то же самое. Любые идеи?
Изменение типа DateCreated to 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
Вам нужно вручную отредактировать XML файл edmx и установить атрибуты SSDL StoreGeneratedPattern для идентификации или вычисления. Но всякий раз, когда вы обновляете edmx через дизайнера, ваши изменения будут перезаписаны.
Это известная проблема. Для получения дополнительной информации см. Следующие ссылки:
У меня была такая же проблема! Для меня это работает следующим образом:
База данных 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
Работает для меня!
Вот рабочий способ:
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();
Сосредоточившись на том, что я не хочу менять базу данных, поскольку это проблема приложения, и я ожидаю, что они однажды разрешат эту проблему, мое решение (что вполне возможно в моем случае) заключается в создании частичного класса модели для исправления проблемы в конструкторе:
public partial class Log
{
public Log()
{
this.Date = DateTime.Now;
}
}
Это работает для меня, потому что:
Не забывайте, что пространство имен должно совпадать с пространством имен модели или частичным, но не должно перечислять свойства (и также не должно быть частичным;])!