提交 612e5fee 编写于 作者: S Shay Rojansky

Sync to preview2-30335, mapping changes

Some work on type mapping to make everything work.
Every mapping now has to be one-to-one: a mapping returned for a CLR
type must contain that same type; previously when looking up by
DateTimeOffset we would return a timestamptz mapping which specified
CLR DateTime.

We now have separate mappings for DateTimeOffset and DateTime
(as well as for byte and short), and can handle multiple mappings
given a store type.
上级 42ac7d44
......@@ -23,8 +23,9 @@
<Compile Include="..\Shared\*.cs" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="2.1.0-preview2-30335" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="2.1.0-preview2-30335" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="2.1.0-preview2-30366" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="2.1.0-preview2-30366" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Abstractions" Version="2.1.0-preview2-30366" />
<PackageReference Include="Npgsql" Version="3.2.7" />
</ItemGroup>
<ItemGroup>
......
......@@ -15,7 +15,7 @@ protected override string GenerateNonNullSqlLiteral(object value)
public class NpgsqlTimestampTzTypeMapping : NpgsqlTypeMapping
{
public NpgsqlTimestampTzTypeMapping() : base("timestamp with time zone", typeof(DateTime), NpgsqlDbType.TimestampTZ) {}
public NpgsqlTimestampTzTypeMapping(Type clrType) : base("timestamp with time zone", clrType, NpgsqlDbType.TimestampTZ) {}
protected override string GenerateNonNullSqlLiteral(object value)
{
......@@ -45,7 +45,7 @@ public NpgsqlDateTypeMapping()
: this(null) {}
public NpgsqlDateTypeMapping(ValueConverter converter)
: base("date", typeof(DateTime), converter, null, System.Data.DbType.Date) {}
: base("date", typeof(DateTime), converter, null, null, System.Data.DbType.Date) {}
public override RelationalTypeMapping Clone(string storeType, int? size)
=> new NpgsqlDateTypeMapping(Converter);
......
......@@ -10,7 +10,7 @@ public class NpgsqlHstoreTypeMapping : NpgsqlTypeMapping
static readonly HstoreComparer ComparerInstance = new HstoreComparer();
public NpgsqlHstoreTypeMapping()
: base("hstore", typeof(Dictionary<string, string>), null, ComparerInstance, NpgsqlDbType.Hstore) {}
: base("hstore", typeof(Dictionary<string, string>), null, ComparerInstance, null, NpgsqlDbType.Hstore) {}
protected override string GenerateNonNullSqlLiteral(object value)
{
......@@ -40,7 +40,8 @@ class HstoreComparer : ValueComparer<Dictionary<string, string>>
{
public HstoreComparer() : base(
(a, b) => Compare(a,b),
source => Snapshot(source))
o => o.GetHashCode(),
o => o == null ? null : new Dictionary<string, string>(o))
{}
static bool Compare(Dictionary<string, string> a, Dictionary<string, string> b)
......@@ -56,9 +57,6 @@ static bool Compare(Dictionary<string, string> a, Dictionary<string, string> b)
return false;
return true;
}
static Dictionary<string, string> Snapshot(Dictionary<string, string> source)
=> source == null ? null : new Dictionary<string, string>(source);
}
}
}
......@@ -52,9 +52,10 @@ public class NpgsqlRangeTypeMapping<T> : NpgsqlTypeMapping
[NotNull] Type clrType,
[CanBeNull] ValueConverter converter,
[CanBeNull] ValueComparer comparer,
[CanBeNull] ValueComparer keyComparer,
RelationalTypeMapping subtypeMapping,
NpgsqlDbType subtypeNpgsqlDbType)
: base(storeType, clrType, converter, comparer, NpgsqlDbType.Range | subtypeNpgsqlDbType)
: base(storeType, clrType, converter, comparer, keyComparer, NpgsqlDbType.Range | subtypeNpgsqlDbType)
{
SubtypeMapping = subtypeMapping;
EmptyLiteral = $"'empty'::{storeType}";
......
......@@ -51,17 +51,18 @@ public class NpgsqlTypeMapping : RelationalTypeMapping
[NotNull] Type clrType,
[CanBeNull] ValueConverter converter,
[CanBeNull] ValueComparer comparer,
[CanBeNull] ValueComparer keyComparer,
NpgsqlDbType npgsqlDbType)
: base(storeType, clrType, converter, comparer)
: base(storeType, clrType, converter, comparer, keyComparer)
{
NpgsqlDbType = npgsqlDbType;
}
public override RelationalTypeMapping Clone(string storeType, int? size)
=> new NpgsqlTypeMapping(storeType, ClrType, Converter, Comparer, NpgsqlDbType);
=> new NpgsqlTypeMapping(storeType, ClrType, Converter, Comparer, KeyComparer, NpgsqlDbType);
public override CoreTypeMapping Clone(ValueConverter converter)
=> new NpgsqlTypeMapping(StoreType, ClrType, ComposeConverter(converter), Comparer, NpgsqlDbType);
=> new NpgsqlTypeMapping(StoreType, ClrType, ComposeConverter(converter), Comparer, KeyComparer, NpgsqlDbType);
protected override void ConfigureParameter([NotNull] DbParameter parameter)
{
......
......@@ -73,7 +73,7 @@ public static IReadOnlyList<T> NotEmpty<T>(IReadOnlyList<T> value, [InvokerParam
{
NotEmpty(parameterName, nameof(parameterName));
throw new ArgumentException(CoreStrings.CollectionArgumentIsEmpty(parameterName));
throw new ArgumentException(AbstractionsStrings.CollectionArgumentIsEmpty(parameterName));
}
return value;
......@@ -89,7 +89,7 @@ public static string NotEmpty(string value, [InvokerParameterName] [NotNull] str
}
else if (value.Trim().Length == 0)
{
e = new ArgumentException(CoreStrings.ArgumentIsEmpty(parameterName));
e = new ArgumentException(AbstractionsStrings.ArgumentIsEmpty(parameterName));
}
if (e != null)
......@@ -109,7 +109,7 @@ public static string NullButNotEmpty([CanBeNull] string value, [InvokerParameter
{
NotEmpty(parameterName, nameof(parameterName));
throw new ArgumentException(CoreStrings.ArgumentIsEmpty(parameterName));
throw new ArgumentException(AbstractionsStrings.ArgumentIsEmpty(parameterName));
}
return value;
......
......@@ -24,11 +24,11 @@
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="2.1.0-preview2-30335" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="2.1.0-preview2-30335" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational.Specification.Tests" Version="2.1.0-preview2-30335" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="2.1.0-preview2-30335" />
<PackageReference Include="Microsoft.Extensions.Configuration.EnvironmentVariables" Version="2.1.0-preview2-30335" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="2.1.0-preview2-30366" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="2.1.0-preview2-30366" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational.Specification.Tests" Version="2.1.0-preview2-30366" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="2.1.0-preview2-30366" />
<PackageReference Include="Microsoft.Extensions.Configuration.EnvironmentVariables" Version="2.1.0-preview2-30366" />
</ItemGroup>
</Project>
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Query;
using Microsoft.EntityFrameworkCore.TestModels.GearsOfWarModel;
using Microsoft.EntityFrameworkCore.TestUtilities;
using Npgsql.EntityFrameworkCore.PostgreSQL.Infrastructure;
using Npgsql.EntityFrameworkCore.PostgreSQL.TestUtilities;
......@@ -16,6 +17,7 @@ protected override void OnModelCreating(ModelBuilder modelBuilder, DbContext con
base.OnModelCreating(modelBuilder, context);
modelBuilder.HasPostgresExtension("uuid-ossp");
//modelBuilder.Entity<Mission>().Ignore(m => m.Timeline);
}
public override DbContextOptionsBuilder AddOptions(DbContextOptionsBuilder builder)
......
......@@ -12,6 +12,13 @@ public GearsOfWarQueryNpgsqlTest(GearsOfWarQueryNpgsqlFixture fixture, ITestOutp
Fixture.TestSqlLoggerFactory.Clear();
}
public override void Where_datetimeoffset_hour_component()
{
// PostgreSQL has no datatype that corresponds to DateTimeOffset.
// DateTimeOffset gets mapps to "timestamptz" which does not record the offset, so the values coming
// back from the database aren't as expected.
}
public override void Where_datetimeoffset_minute_component()
{
// PostgreSQL has no datatype that corresponds to DateTimeOffset.
......
......@@ -20,10 +20,10 @@
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.3.0" />
<PackageReference Include="Microsoft.Extensions.Logging" Version="2.1.0-preview2-30335" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="2.1.0-preview2-30335" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="2.1.0-preview2-30335" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational.Specification.Tests" Version="2.1.0-preview2-30335" />
<PackageReference Include="Microsoft.Extensions.Logging" Version="2.1.0-preview2-30366" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="2.1.0-preview2-30366" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="2.1.0-preview2-30366" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational.Specification.Tests" Version="2.1.0-preview2-30366" />
</ItemGroup>
</Project>
......@@ -197,11 +197,11 @@ public void ValueComparer_hstore()
};
var comparer = GetMapping("hstore").Comparer;
var snapshot = (Dictionary<string, string>)comparer.SnapshotFunc(source);
var snapshot = (Dictionary<string, string>)comparer.Snapshot(source);
Assert.Equal(source, snapshot);
Assert.True(comparer.CompareFunc(source, snapshot));
Assert.True(comparer.Equals(source, snapshot));
snapshot.Remove("k1");
Assert.False(comparer.CompareFunc(source, snapshot));
Assert.False(comparer.Equals(source, snapshot));
}
[Fact]
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册