2011-12-14 9 views
36

Próbuję odwzorować właściwość TimeSpan Code First na serwer SQL. Code First wydaje się tworzyć go jako czas (7) w SQL. Jednak TimeSpan w .Net może obsługiwać dłużej niż 24 godziny i muszę przechowywać dłużej niż 24 godziny dla długości wydarzenia. Jaki jest najlepszy sposób radzenia sobie z tym za pomocą Code First.Jak mapować TimeSpan na więcej niż 24 godziny na kod serwera SQL?

Odpowiedz

33

Jak na moje previous question, w jaki sposób przechowywania Okres w SQL byłem zaleca się przechowywać go jako sekund lub bilety itp. W końcu nie mapowałem kolumny TimeSpan, ponieważ nie ma odpowiednika w serwerze SQL. Po prostu utworzyłem drugie pole, które przekonwertowało TimeSpan na tyknięcia i zapisało je w DB. I wtedy zapobiega przechowywaniu Okres

public Int64 ValidityPeriodTicks { get; set; } 

[NotMapped] 
public TimeSpan ValidityPeriod 
{ 
    get { return TimeSpan.FromTicks(ValidityPeriodTicks); } 
    set { ValidityPeriodTicks = value.Ticks; } 
} 
+2

Takie podejście może prowadzić do nieoptymalnych zapytań, gdy ktoś nie zna lub zapomina, że ​​właściwość ValidityPeriod ma właściwość NotMapped. Jeśli zostanie użyty w LINQ, w którym zapytanie EF nie będzie narzekać, po prostu pobierze kolekcję i powtórzy ją. Z tego powodu można używać staromodnych akcesorów Get/Set, aby było jasne, że nie powinny być używane w zapytaniach. – StanislawSwierc

+0

Zgoda, poprawiłem kod w moim rozwiązaniu, aby implementacja była bardziej przejrzysta. – GraemeMiller

+4

Użyj metod rozszerzających, aby uzyskać lub ustawić wartość, i powinno być mniej nieporozumień. – deerchao

1

Po pierwsze, MVC nie ma nic wspólnego z tym problemem. Jest to całkowicie związane z EF Code First i SQL Server, więc jest to sprawa DAL.

Jednym z rozwiązań mogłoby być zapewnienie niestandardowy typ kolumny w konfiguracji jednostki, tak:

modelBuilder 
.Entity<MyClass>() 
.Property(c => c.MyTimeSpan) 
.HasColumnType("whatever sql type you want to use"); 
+0

Ok. Jest to typ SQL, którego chcesz używać. Jaki jest standardowy sposób mapowania .Net TimeSpan na pole serwera SQL. – GraemeMiller

+0

Myślałem, że to było wystarczająco jasne. Parametr string metody HasColumnType musi zawierać twój typ SQL tak, jak zadeklarowałbyś go w skrypcie sql lub projektant tabeli, takim jak nvarchar (50) lub bit lub czegokolwiek, czego potrzebujesz i jest zgodny z typem danych .Net, którego używasz . Jaki dokładnie typ użyć w konkretnym przypadku, po prostu eksperymentuj. –

+5

Wiedziałem, jak zmienić typ kolumny, to nie jest problem. Wydaje się, że dość powszechnym problemem jest mapowanie .Net TimeSpan na SQL. Chciałem się dowiedzieć, jaki jest najlepszy sposób na przechowywanie .Net TimeSpan na serwerze SQL. – GraemeMiller

3

O ile wiem, nie ma odpowiednika typ danych w SQL Server dla .NET za TimeSpan. Najbliższym dopasowaniem jest czas, ale, jak wskazałeś, obsługuje tylko wartości do 24 godzin? http://msdn.microsoft.com/en-us/library/ms186724.aspx#DateandTimeDataTypes.

Poniższy dokument MSDN opisuje ten http://msdn.microsoft.com/en-us/library/bb386909.aspx. Zakładam, że ponieważ nie ma tam żadnego rozwiązania, nie jest to obecnie możliwe.

+1

Tak, nigdy nie odnalazłem się poza moją odpowiedzią. Wydaje się, że EF wydaje się podejmować nieparzystą decyzję, aby odwzorować ją na typ danych SQL Server Time, który oczywiście jest niedopasowaniem – GraemeMiller

Powiązane problemy