2013-03-22 4 views
4

Я использую EF 5 и C#.Entity Framework TimeSpan - ошибка времени

В моем основном проекте я использую CodeFirst для создания моей базы данных. Там я получил эту Entity:

public class Shift { 
    public string Name { get; set; } 
    public TimeSpan StartTime { get; set; } 
    public TimeSpan EndTime { get; set; } 
    } 

Свойства TimeSpan создаются как время (7), а не нуль в базе данных.

В моем основном проекте все работает правильно.

Но при доступе к базе данных из проекта службы Windows (я использую тот же контекст & Модели из MainProject) в том же решении я получаю эту ошибку:

Этой строку (несколько раз, используемых в MainProject):

context.Shifts.Load(); 

приводит

There is no store type corresponding to the conceptual side type 'Edm.Time(Nullable=True,DefaultValue=,Precision=)' of primitive type 'Time'. 

Что является причиной этой проблемы?

// редактировать

Самое смешное, наш главный проект, созданный временной Column без нашего HELO.

Я заменил файл App.Config Сервиса конфигурацией нашего основного проекта и теперь он работает?

Я до сих пор удивляюсь, почему жестко ...

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <configSections> 
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 --> 
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> 
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,Log4net" /> 
    </configSections> 
    <connectionStrings> 
    <add name="DevConnectionString" connectionString="Data Source=xxxxxxIntegrated Security=True" providerName="System.Data.SqlClient" /> 
    <add name="Properties.Settings.DevConnectionString" connectionString="Integrated Security=TrueMultipleActiveResultSets=True" providerName="System.Data.SqlClient" /> 
    </connectionStrings> 
    <startup> 
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> 
    </startup> 
    <entityFramework> 
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" /> 
    </entityFramework> 
    <log4net> 
    <root> 
     <level value="DEBUG" /> 
     <appender-ref ref="LogFileAppender" /> 
    </root> 
    <appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender"> 
     <param name="File" value="log\Error.log" /> 
     <param name="AppendToFile" value="true" /> 
     <rollingStyle value="Size" /> 
     <maxSizeRollBackups value="10" /> 
     <maximumFileSize value="10MB" /> 
     <staticLogFileName value="true" /> 
     <layout type="log4net.Layout.PatternLayout"> 
     <param name="ConversionPattern" value="%n%-5p %d{yyyy-MM-dd hh:mm:ss} – %m%n" /> 
     </layout> 
    </appender> 
    </log4net> 
    <runtime> 
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
     <dependentAssembly> 
     <assemblyIdentity name="System.Windows.Interactivity" publicKeyToken="31bf3856ad364e35" culture="neutral" /> 
     <bindingRedirect oldVersion="0.0.0.0-4.5.0.0" newVersion="4.5.0.0" /> 
     </dependentAssembly> 
    </assemblyBinding> 
    </runtime> 
</configuration> 
+0

Я только что столкнулся с этой проблемой, используя SqlServer Compact Edition (SQLCE). Таким образом, похоже, что это основная проблема с базой данных. –

ответ

5

Ваш вопрос может быть объяснено вашей SqlServer версии.

Entity Framework 5 поддержка TimeSpan. Он использует time в качестве типа поддержки Sql. Поддержка типа time началась с SqlServer 2008. Возможно ли, что вы переключились с экземпляра SqlServer 2005 на 08 или новее? Это привело бы к тому, что все внезапно работало так, как вы пережили.

Следует упомянуть, что использование TimeSpan с EF может быть проблематичным, поскольку тип поддержки time(7) будет удерживать только временной интервал < 24 часа в длину. Поэтому обычно используется обходной путь, упомянутый floAr.

15

Entity Framework версии 5 не отображает отрезок времени. Но ou может использовать обходной путь, чтобы использовать его в любом случае.

Просто хранить отрезок времени как TimeSpan для манипулирования и как Int64 для отображения

public Int64 TimeSpanTicks{ get; set; }  
[NotMapped] 
public TimeSpan TimeSpanValue 
{ 
    get { return TimeSpan.FromTicks(TimeSpanTicks); } 
    set { TimeSpanTicks= value.Ticks; } 
} 
+0

Это также позволяет избежать каких-либо проблем при хранении значения в db с потерей точности на тиках, так как IIRC существует некорректность в точности, если вы используете время (7) по очевидным причинам – finman

+0

Я решил свою проблему, но до сих пор не знаю, почему ее разрешено (см. edit). Есть идеи? – TheJoeIaut

+1

* Entity Framework версии 5 не отображает временные интервалы. * Я использую EF5 из NuGet, и он просто сопоставил свойство TimeSpan просто отлично. –