Entity Framework 4 отображает DateTimeOffset в SQL datetime в Visual Studio 2010 - PullRequest
4 голосов
/ 15 апреля 2010

Я использую Visual Studio 2010 RTM с .NET / Entity Framework 4 RTM с подходом, основанным на моделировании. Когда я создаю сущность с полем DateTimeOffset, разработчик модели EF пытается сопоставить DateTimeOffset с SQL datetime вместо SQL datetimeoffset. Я использую SQL Server 2008 Express, поэтому datetimeoffset поддерживается в базе данных.

Visual Studio выдает эту ошибку:

Ошибка 2019: указанное сопоставление элемента недопустимо. Тип 'Edm.DateTimeOffset [Nullable = False, DefaultValue =, Precision =]' члена 'Создан' в типе 'Data.SqlStorage.MyType' не совместим с 'SqlServer.datetime [Nullable = False, DefaultValue =, Precision = 3] 'члена' Создано 'в типе' Data.SqlStorage.Store.MyTypes

Если я редактирую тип непосредственно в разделе EDMX StorageModels xml, я получаю следующую ошибку:

Ошибка 40: для типа datetimeoffset не указано пространство имен или псевдоним. Только PrimitiveTypes могут быть использованы без квалификации.

Почему разработчик не может правильно сопоставить это с типом даты и времени в SQL? Эта проблема также возникала, когда я все еще работал с бета-версиями Visual Studio 2010 и .NET Framework 4.

Ответы [ 3 ]

5 голосов
/ 24 апреля 2011

В версии RTM вы можете сделать что-то подобное в вашем DbContext:

 protected override void OnModelCreating(DbModelBuilder modelBuilder) {
     modelBuilder.Entity<EntityName>().Property(p => p.PropertyName).HasColumnType("datetimeoffset");
 }

Это также полезно для указания Entity Framework Code First использовать datetime2 вместо datetime при создании базы данных.

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

Решение было обновить с БД один раз, ПОСЛЕ того, как вы вручную изменили сценарий sql и сгенерировали БД. Я сделал это, и после того, как я проверил свое сопоставление таблиц, тип данных был изменен на DATE вместо DATETIME. Я думаю, что то же самое можно применить, если вы хотите перейти на DATETIME2.

1 голос
/ 15 апреля 2010

Попробуйте пойти другим путем (DB-> Model). Это сработало для Джули Лерман .Мне кажется, ваш EDMX, отредактированный вручную, также должен работать, если вы квалифицируете DateTimeOffset с пространством имен.

...