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
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; }
}
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");
Ok. Jest to typ SQL, którego chcesz używać. Jaki jest standardowy sposób mapowania .Net TimeSpan na pole serwera SQL. – GraemeMiller
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. –
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
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.
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
- 1. Format TimeSpan większa niż 24 godziny
- 2. Jak przekonwertować TimeSpan na 24 godziny i minuty String?
- 3. Jak sparsować ciąg z godzinami większymi niż 24 do TimeSpan?
- 4. PHP DateTime(): Wyświetlaj czas dłuższy niż 24 godziny, ale nie jako dni, jeśli jest dłuższy niż 24 godziny.
- 5. Jak dodać 24 godziny na datetime przedmiotu javascript
- 6. Odejmij 24 godziny w T-SQL od dzisiejszej daty
- 7. Sklep przez ponad 24 godziny w DataTime
- 8. SQL Inner dołączyć więcej niż dwie tabele
- 9. Konwersja z TimeSpan na DateTime
- 10. Więcej niż 2 przyciski na sweetalert 2
- 11. Czas względny JavaScript 24 godziny temu itp. Jak w czasie
- 12. Format daty, jak HH: mm 24 godziny bez AM/PM
- 13. Jak przekonwertować ciąg 12 godzin na C# TimeSpan?
- 14. Jak mogę wytworzyć więcej niż jeden format pliku na kod wydruku w R?
- 15. Sprawdzanie PHP czy znacznik czasu jest dłuższy niż 24 godziny od teraz
- 16. Jak wygląda indeks B-drzewa na więcej niż jednej kolumnie?
- 17. Jak przesłać więcej niż 100 plików na raz w github?
- 18. Zapytanie sql do wybrania od 1 godziny temu?
- 19. Automapper braku mapować na IEnumerable
- 20. Jak mapować tekstury na zakrzywionej powierzchni?
- 21. Jak mapować z mapy na listę
- 22. Nodejs: chcę mapować domeny na serwer
- 23. Nie można mapować na HList
- 24. Entity Framework - typ edm jest odwzorowany na więcej niż jeden
- 25. Wyrażenie regularne odpowiadające czasowi w formacie wojskowym (24 godziny)
- 26. Kod działa 2x szybciej na Windows niż na Linuksie
- 27. Jak przekonwertować wynik Datareader z DbType.Time na obiekt Timespan?
- 28. Regex dla formatu 12 godzinnej i czas 24 godziny na dobę
- 29. Jak zasymulować więcej niż jedno żądanie (na przykład 4000 lub więcej) na jednej stronie, aby przetestować wydajność?
- 30. Godziny projektowania operacji Tabela SQL
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
Zgoda, poprawiłem kod w moim rozwiązaniu, aby implementacja była bardziej przejrzysta. – GraemeMiller
Użyj metod rozszerzających, aby uzyskać lub ustawić wartość, i powinno być mniej nieporozumień. – deerchao