Рекомендации по переполнению Entity Framework и SqlDateTime - PullRequest
5 голосов
/ 15 октября 2010

System.DateTime может принимать более широкий диапазон значений, чем DateTime SQL Server.Следовательно, есть класс System.Data.SqlTypes.SqlDateTime, который имитирует более поздние.

Следовательно, я ожидал, что Entity Framework выберет SqlDateTime, но это не так.

Так что мои вопросы ...

Как лучше всего убедиться, что ваши значения DateTime не вызовут проблем при попытке сохранить их в базе данных?

Есть ли способ заставить EF использовать SqlDateTime?

Ответы [ 3 ]

4 голосов
/ 15 октября 2010

Вы можете сделать несколько вещей:

  • , если вы используете SQL Server 2008 или новее, вы можете использовать типы данных DATE или DATETIME2 наБаза данных, которая предлагает тот же диапазон дат, что и *. 1007 *

  • .NET, если вы не можете использовать эти новые типы данных, вам придется выполнить некоторые проверки / проверки на вашемполя даты перед сохранением вещей в постоянном хранилище.EF EntityObject предлагает множество способов задействовать процесс проверки и сохранения объектов - выберите один подход, который вам подходит

1 голос
/ 26 сентября 2013

Возможно, это старая ветка, но я опубликую свои выводы по этому вопросу для других:

Допустим, у нас есть dev env: EF 5, CodeFirst, SqlCE 4.0:

public abstract class Entity : IEntity, IEquatable<Entity>
{
public virtual int Id { get; protected set; }
public virtual DateTime LastModified { get; set; }

[DataType(DataType.Date)]
public virtual DateTime CreatedOn { get; set; }

[DataType(DataType.DateTime)]
public virtual DateTime CreatedOn2 { get; set; }

[DataType(DataType.Time)]
public virtual DateTime CreatedOn3 { get; set; }

public virtual DateTime CreatedOn4 { get; set; }
}

с таким настраиваемым отображением:

public EntityMapping()
{
HasKey(e => e.Id);
Property(e => e.Id);
Property(e => e.LastModified).IsRequired().IsConcurrencyToken();
Property(e => e.CreatedOn).IsRequired();
Property(e => e.CreatedOn2).IsRequired();
Property(e => e.CreatedOn3).IsRequired();
Property(e => e.CreatedOn4).IsRequired();
}

Это создает this , что означает, что у нас будет исключение переполнения.

Изменение сопоставлений с этим, пока ещеработа с SQL CE 4.0:

Property(e => e.CreatedOn).IsRequired().HasColumnType("datetime2");
Property(e => e.CreatedOn2).IsRequired().HasColumnType("date");
Property(e => e.CreatedOn3).IsRequired().HasColumnType("date");
Property(e => e.CreatedOn4).IsRequired().HasColumnType("datetime2");

Дает эту ошибку .Переход на SQL Server Standart 2012, похоже, решает проблему (это точно не решение - только для эксперимента).Созданная схема SQL Server this .

Я не эксперт по SQL, но мне кажется, что SQL CE не поддерживает эти даты .проблема с развитием окр.остается.DateTime может быть заменен, но может принести много рефакторинга здесь и там.

Помните также, что SqlDateTime и DateTime сильно отличаются .

Решение, которое я считаю хорошимдля кода и для жизненного цикла проекта - это переключение между LocalDb и стандартом SQL, как предлагается по одной из приведенных выше ссылок из stackoverflow, в сочетании с пользовательскими настройками отображения fluentApi для выравнивания создания модели или обоих.

Представляем Пользовательское соглашение в EF также выглядит неплохо.

Если у кого-то есть лучшее универсальное решение для кода и для разработки, выложите его.

1 голос
/ 04 января 2011

Более конкретно, попробуйте это: http://www.vfstech.com/?p=111

...