-
Notifications
You must be signed in to change notification settings - Fork 3.1k
/
SqlServerDateTimeTypeMapping.cs
138 lines (126 loc) · 6.12 KB
/
SqlServerDateTimeTypeMapping.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using System;
using System.Data;
using System.Data.Common;
using Microsoft.Data.SqlClient;
using Microsoft.EntityFrameworkCore.Storage;
namespace Microsoft.EntityFrameworkCore.SqlServer.Storage.Internal
{
/// <summary>
/// This is an internal API that supports the Entity Framework Core infrastructure and not subject to
/// the same compatibility standards as public APIs. It may be changed or removed without notice in
/// any release. You should only use it directly in your code with extreme caution and knowing that
/// doing so can result in application failures when updating to a new Entity Framework Core release.
/// </summary>
public class SqlServerDateTimeTypeMapping : DateTimeTypeMapping
{
private const string DateFormatConst = "'{0:yyyy-MM-dd}'";
private const string SmallDateTimeFormatConst = "'{0:yyyy-MM-ddTHH:mm:ss}'";
private const string DateTimeFormatConst = "'{0:yyyy-MM-ddTHH:mm:ss.fff}'";
// Note: this array will be accessed using the precision as an index
// so the order of the entries in this array is important
private readonly string[] _dateTime2Formats =
{
"'{0:yyyy-MM-ddTHH:mm:ss}'",
"'{0:yyyy-MM-ddTHH:mm:ss.fK}'",
"'{0:yyyy-MM-ddTHH:mm:ss.ffK}'",
"'{0:yyyy-MM-ddTHH:mm:ss.fffK}'",
"'{0:yyyy-MM-ddTHH:mm:ss.ffffK}'",
"'{0:yyyy-MM-ddTHH:mm:ss.fffffK}'",
"'{0:yyyy-MM-ddTHH:mm:ss.ffffffK}'",
"'{0:yyyy-MM-ddTHH:mm:ss.fffffffK}'"
};
/// <summary>
/// This is an internal API that supports the Entity Framework Core infrastructure and not subject to
/// the same compatibility standards as public APIs. It may be changed or removed without notice in
/// any release. You should only use it directly in your code with extreme caution and knowing that
/// doing so can result in application failures when updating to a new Entity Framework Core release.
/// </summary>
public SqlServerDateTimeTypeMapping(
string storeType,
DbType? dbType = System.Data.DbType.DateTime2,
StoreTypePostfix storeTypePostfix = StoreTypePostfix.Precision)
: base(
new RelationalTypeMappingParameters(
new CoreTypeMappingParameters(typeof(DateTime)),
storeType,
storeTypePostfix,
dbType))
{
}
/// <summary>
/// This is an internal API that supports the Entity Framework Core infrastructure and not subject to
/// the same compatibility standards as public APIs. It may be changed or removed without notice in
/// any release. You should only use it directly in your code with extreme caution and knowing that
/// doing so can result in application failures when updating to a new Entity Framework Core release.
/// </summary>
protected SqlServerDateTimeTypeMapping(RelationalTypeMappingParameters parameters)
: base(parameters)
{
}
/// <summary>
/// This is an internal API that supports the Entity Framework Core infrastructure and not subject to
/// the same compatibility standards as public APIs. It may be changed or removed without notice in
/// any release. You should only use it directly in your code with extreme caution and knowing that
/// doing so can result in application failures when updating to a new Entity Framework Core release.
/// </summary>
protected override void ConfigureParameter(DbParameter parameter)
{
base.ConfigureParameter(parameter);
// Workaround for a SQLClient bug
if (DbType == System.Data.DbType.Date)
{
((SqlParameter)parameter).SqlDbType = SqlDbType.Date;
}
if (Size.HasValue
&& Size.Value != -1)
{
parameter.Size = Size.Value;
}
if (Precision.HasValue)
{
parameter.Precision = unchecked((byte)Precision.Value);
}
}
/// <summary>
/// Creates a copy of this mapping.
/// </summary>
/// <param name="parameters">The parameters for this mapping.</param>
/// <returns>The newly created mapping.</returns>
protected override RelationalTypeMapping Clone(RelationalTypeMappingParameters parameters)
=> new SqlServerDateTimeTypeMapping(parameters);
/// <summary>
/// This is an internal API that supports the Entity Framework Core infrastructure and not subject to
/// the same compatibility standards as public APIs. It may be changed or removed without notice in
/// any release. You should only use it directly in your code with extreme caution and knowing that
/// doing so can result in application failures when updating to a new Entity Framework Core release.
/// </summary>
protected override string SqlLiteralFormatString
{
get
{
switch (StoreType)
{
case "date":
return DateFormatConst;
case "datetime":
return DateTimeFormatConst;
case "smalldatetime":
return SmallDateTimeFormatConst;
default:
if (Precision.HasValue)
{
var precision = Precision.Value;
if (precision <= 7
&& precision >= 0)
{
return _dateTime2Formats[precision];
}
}
return _dateTime2Formats[7];
}
}
}
}
}