|
|
|
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
|
|
|
|
|
|
|
|
|
using System;
|
|
|
|
|
using EntityFrameworkCore.Jet.FunctionalTests.TestUtilities;
|
|
|
|
|
using Microsoft.EntityFrameworkCore;
|
|
|
|
|
using Microsoft.EntityFrameworkCore.Diagnostics;
|
|
|
|
|
using Microsoft.EntityFrameworkCore.TestUtilities;
|
|
|
|
|
using Xunit;
|
|
|
|
|
|
|
|
|
|
// ReSharper disable InconsistentNaming
|
|
|
|
|
namespace EntityFrameworkCore.Jet.FunctionalTests
|
|
|
|
|
{
|
|
|
|
|
public class CustomConvertersJetTest : CustomConvertersTestBase<CustomConvertersJetTest.CustomConvertersJetFixture>
|
|
|
|
|
{
|
|
|
|
|
public CustomConvertersJetTest(CustomConvertersJetFixture fixture)
|
|
|
|
|
: base(fixture)
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[ConditionalFact]
|
|
|
|
|
public virtual void Columns_have_expected_data_types()
|
|
|
|
|
{
|
|
|
|
|
var actual = BuiltInDataTypesJetTest.QueryForColumnTypes(
|
|
|
|
|
CreateContext(),
|
|
|
|
|
nameof(ObjectBackedDataTypes), nameof(NullableBackedDataTypes), nameof(NonNullableBackedDataTypes));
|
|
|
|
|
|
|
|
|
|
const string expected = @"Animal.Id ---> `int` [Precision = 10 Scale = 0]
|
|
|
|
|
AnimalDetails.AnimalId ---> `nullable int` [Precision = 10 Scale = 0]
|
|
|
|
|
AnimalDetails.BoolField ---> `int` [Precision = 10 Scale = 0]
|
|
|
|
|
AnimalDetails.Id ---> `int` [Precision = 10 Scale = 0]
|
|
|
|
|
AnimalIdentification.AnimalId ---> `int` [Precision = 10 Scale = 0]
|
|
|
|
|
AnimalIdentification.Id ---> `int` [Precision = 10 Scale = 0]
|
|
|
|
|
AnimalIdentification.Method ---> `int` [Precision = 10 Scale = 0]
|
|
|
|
|
BinaryForeignKeyDataType.BinaryKeyDataTypeId ---> `nullable varbinary` [MaxLength = 900]
|
|
|
|
|
BinaryForeignKeyDataType.Id ---> `int` [Precision = 10 Scale = 0]
|
|
|
|
|
BinaryKeyDataType.Ex ---> `nullable nvarchar` [MaxLength = -1]
|
|
|
|
|
BinaryKeyDataType.Id ---> `varbinary` [MaxLength = 900]
|
|
|
|
|
Blog.BlogId ---> `int` [Precision = 10 Scale = 0]
|
|
|
|
|
Blog.Discriminator ---> `nvarchar` [MaxLength = -1]
|
|
|
|
|
Blog.IsVisible ---> `nvarchar` [MaxLength = 1]
|
|
|
|
|
Blog.RssUrl ---> `nullable nvarchar` [MaxLength = -1]
|
|
|
|
|
Blog.Url ---> `nullable nvarchar` [MaxLength = -1]
|
|
|
|
|
BuiltInDataTypes.Enum16 ---> `bigint` [Precision = 19 Scale = 0]
|
|
|
|
|
BuiltInDataTypes.Enum32 ---> `bigint` [Precision = 19 Scale = 0]
|
|
|
|
|
BuiltInDataTypes.Enum64 ---> `bigint` [Precision = 19 Scale = 0]
|
|
|
|
|
BuiltInDataTypes.Enum8 ---> `varchar` [MaxLength = -1]
|
|
|
|
|
BuiltInDataTypes.EnumS8 ---> `nvarchar` [MaxLength = 24]
|
|
|
|
|
BuiltInDataTypes.EnumU16 ---> `decimal` [Precision = 20 Scale = 0]
|
|
|
|
|
BuiltInDataTypes.EnumU32 ---> `decimal` [Precision = 20 Scale = 0]
|
|
|
|
|
BuiltInDataTypes.EnumU64 ---> `decimal` [Precision = 20 Scale = 0]
|
|
|
|
|
BuiltInDataTypes.Id ---> `int` [Precision = 10 Scale = 0]
|
|
|
|
|
BuiltInDataTypes.PartitionId ---> `bigint` [Precision = 19 Scale = 0]
|
|
|
|
|
BuiltInDataTypes.TestBoolean ---> `nchar` [MaxLength = 4]
|
|
|
|
|
BuiltInDataTypes.TestByte ---> `int` [Precision = 10 Scale = 0]
|
|
|
|
|
BuiltInDataTypes.TestCharacter ---> `int` [Precision = 10 Scale = 0]
|
|
|
|
|
BuiltInDataTypes.TestDateTime ---> `bigint` [Precision = 19 Scale = 0]
|
|
|
|
|
BuiltInDataTypes.TestDateTimeOffset ---> `bigint` [Precision = 19 Scale = 0]
|
|
|
|
|
BuiltInDataTypes.TestDecimal ---> `varbinary` [MaxLength = 16]
|
|
|
|
|
BuiltInDataTypes.TestDouble ---> `decimal` [Precision = 26 Scale = 16]
|
|
|
|
|
BuiltInDataTypes.TestInt16 ---> `bigint` [Precision = 19 Scale = 0]
|
|
|
|
|
BuiltInDataTypes.TestInt32 ---> `bigint` [Precision = 19 Scale = 0]
|
|
|
|
|
BuiltInDataTypes.TestInt64 ---> `bigint` [Precision = 19 Scale = 0]
|
|
|
|
|
BuiltInDataTypes.TestSignedByte ---> `decimal` [Precision = 18 Scale = 2]
|
|
|
|
|
BuiltInDataTypes.TestSingle ---> `float` [Precision = 53]
|
|
|
|
|
BuiltInDataTypes.TestTimeSpan ---> `float` [Precision = 53]
|
|
|
|
|
BuiltInDataTypes.TestUnsignedInt16 ---> `decimal` [Precision = 20 Scale = 0]
|
|
|
|
|
BuiltInDataTypes.TestUnsignedInt32 ---> `decimal` [Precision = 20 Scale = 0]
|
|
|
|
|
BuiltInDataTypes.TestUnsignedInt64 ---> `bigint` [Precision = 19 Scale = 0]
|
|
|
|
|
BuiltInDataTypesShadow.Enum16 ---> `bigint` [Precision = 19 Scale = 0]
|
|
|
|
|
BuiltInDataTypesShadow.Enum32 ---> `bigint` [Precision = 19 Scale = 0]
|
|
|
|
|
BuiltInDataTypesShadow.Enum64 ---> `bigint` [Precision = 19 Scale = 0]
|
|
|
|
|
BuiltInDataTypesShadow.Enum8 ---> `nvarchar` [MaxLength = -1]
|
|
|
|
|
BuiltInDataTypesShadow.EnumS8 ---> `nvarchar` [MaxLength = -1]
|
|
|
|
|
BuiltInDataTypesShadow.EnumU16 ---> `decimal` [Precision = 20 Scale = 0]
|
|
|
|
|
BuiltInDataTypesShadow.EnumU32 ---> `decimal` [Precision = 20 Scale = 0]
|
|
|
|
|
BuiltInDataTypesShadow.EnumU64 ---> `decimal` [Precision = 20 Scale = 0]
|
|
|
|
|
BuiltInDataTypesShadow.Id ---> `int` [Precision = 10 Scale = 0]
|
|
|
|
|
BuiltInDataTypesShadow.PartitionId ---> `bigint` [Precision = 19 Scale = 0]
|
|
|
|
|
BuiltInDataTypesShadow.TestBoolean ---> `nvarchar` [MaxLength = -1]
|
|
|
|
|
BuiltInDataTypesShadow.TestByte ---> `int` [Precision = 10 Scale = 0]
|
|
|
|
|
BuiltInDataTypesShadow.TestCharacter ---> `int` [Precision = 10 Scale = 0]
|
|
|
|
|
BuiltInDataTypesShadow.TestDateTime ---> `bigint` [Precision = 19 Scale = 0]
|
|
|
|
|
BuiltInDataTypesShadow.TestDateTimeOffset ---> `bigint` [Precision = 19 Scale = 0]
|
|
|
|
|
BuiltInDataTypesShadow.TestDecimal ---> `varbinary` [MaxLength = 16]
|
|
|
|
|
BuiltInDataTypesShadow.TestDouble ---> `decimal` [Precision = 26 Scale = 16]
|
|
|
|
|
BuiltInDataTypesShadow.TestInt16 ---> `bigint` [Precision = 19 Scale = 0]
|
|
|
|
|
BuiltInDataTypesShadow.TestInt32 ---> `bigint` [Precision = 19 Scale = 0]
|
|
|
|
|
BuiltInDataTypesShadow.TestInt64 ---> `bigint` [Precision = 19 Scale = 0]
|
|
|
|
|
BuiltInDataTypesShadow.TestSignedByte ---> `decimal` [Precision = 18 Scale = 2]
|
|
|
|
|
BuiltInDataTypesShadow.TestSingle ---> `float` [Precision = 53]
|
|
|
|
|
BuiltInDataTypesShadow.TestTimeSpan ---> `float` [Precision = 53]
|
|
|
|
|
BuiltInDataTypesShadow.TestUnsignedInt16 ---> `decimal` [Precision = 20 Scale = 0]
|
|
|
|
|
BuiltInDataTypesShadow.TestUnsignedInt32 ---> `decimal` [Precision = 20 Scale = 0]
|
|
|
|
|
BuiltInDataTypesShadow.TestUnsignedInt64 ---> `bigint` [Precision = 19 Scale = 0]
|
|
|
|
|
BuiltInNullableDataTypes.Enum16 ---> `nullable bigint` [Precision = 19 Scale = 0]
|
|
|
|
|
BuiltInNullableDataTypes.Enum32 ---> `nullable bigint` [Precision = 19 Scale = 0]
|
|
|
|
|
BuiltInNullableDataTypes.Enum64 ---> `nullable bigint` [Precision = 19 Scale = 0]
|
|
|
|
|
BuiltInNullableDataTypes.Enum8 ---> `nullable nvarchar` [MaxLength = -1]
|
|
|
|
|
BuiltInNullableDataTypes.EnumS8 ---> `nullable nvarchar` [MaxLength = -1]
|
|
|
|
|
BuiltInNullableDataTypes.EnumU16 ---> `nullable decimal` [Precision = 20 Scale = 0]
|
|
|
|
|
BuiltInNullableDataTypes.EnumU32 ---> `nullable decimal` [Precision = 20 Scale = 0]
|
|
|
|
|
BuiltInNullableDataTypes.EnumU64 ---> `nullable decimal` [Precision = 20 Scale = 0]
|
|
|
|
|
BuiltInNullableDataTypes.Id ---> `int` [Precision = 10 Scale = 0]
|
|
|
|
|
BuiltInNullableDataTypes.PartitionId ---> `bigint` [Precision = 19 Scale = 0]
|
|
|
|
|
BuiltInNullableDataTypes.TestByteArray ---> `nullable varbinary` [MaxLength = -1]
|
|
|
|
|
BuiltInNullableDataTypes.TestNullableBoolean ---> `nullable nvarchar` [MaxLength = -1]
|
|
|
|
|
BuiltInNullableDataTypes.TestNullableByte ---> `nullable int` [Precision = 10 Scale = 0]
|
|
|
|
|
BuiltInNullableDataTypes.TestNullableCharacter ---> `nullable int` [Precision = 10 Scale = 0]
|
|
|
|
|
BuiltInNullableDataTypes.TestNullableDateTime ---> `nullable bigint` [Precision = 19 Scale = 0]
|
|
|
|
|
BuiltInNullableDataTypes.TestNullableDateTimeOffset ---> `nullable bigint` [Precision = 19 Scale = 0]
|
|
|
|
|
BuiltInNullableDataTypes.TestNullableDecimal ---> `nullable varbinary` [MaxLength = 16]
|
|
|
|
|
BuiltInNullableDataTypes.TestNullableDouble ---> `nullable decimal` [Precision = 26 Scale = 16]
|
|
|
|
|
BuiltInNullableDataTypes.TestNullableInt16 ---> `nullable bigint` [Precision = 19 Scale = 0]
|
|
|
|
|
BuiltInNullableDataTypes.TestNullableInt32 ---> `nullable bigint` [Precision = 19 Scale = 0]
|
|
|
|
|
BuiltInNullableDataTypes.TestNullableInt64 ---> `nullable bigint` [Precision = 19 Scale = 0]
|
|
|
|
|
BuiltInNullableDataTypes.TestNullableSignedByte ---> `nullable decimal` [Precision = 18 Scale = 2]
|
|
|
|
|
BuiltInNullableDataTypes.TestNullableSingle ---> `nullable float` [Precision = 53]
|
|
|
|
|
BuiltInNullableDataTypes.TestNullableTimeSpan ---> `nullable float` [Precision = 53]
|
|
|
|
|
BuiltInNullableDataTypes.TestNullableUnsignedInt16 ---> `nullable decimal` [Precision = 20 Scale = 0]
|
|
|
|
|
BuiltInNullableDataTypes.TestNullableUnsignedInt32 ---> `nullable decimal` [Precision = 20 Scale = 0]
|
|
|
|
|
BuiltInNullableDataTypes.TestNullableUnsignedInt64 ---> `nullable bigint` [Precision = 19 Scale = 0]
|
|
|
|
|
BuiltInNullableDataTypes.TestString ---> `nullable nvarchar` [MaxLength = -1]
|
|
|
|
|
BuiltInNullableDataTypesShadow.Enum16 ---> `nullable smallint` [Precision = 5 Scale = 0]
|
|
|
|
|
BuiltInNullableDataTypesShadow.Enum32 ---> `nullable int` [Precision = 10 Scale = 0]
|
|
|
|
|
BuiltInNullableDataTypesShadow.Enum64 ---> `nullable bigint` [Precision = 19 Scale = 0]
|
|
|
|
|
BuiltInNullableDataTypesShadow.Enum8 ---> `nullable tinyint` [Precision = 3 Scale = 0]
|
|
|
|
|
BuiltInNullableDataTypesShadow.EnumS8 ---> `nullable smallint` [Precision = 5 Scale = 0]
|
|
|
|
|
BuiltInNullableDataTypesShadow.EnumU16 ---> `nullable int` [Precision = 10 Scale = 0]
|
|
|
|
|
BuiltInNullableDataTypesShadow.EnumU32 ---> `nullable bigint` [Precision = 19 Scale = 0]
|
|
|
|
|
BuiltInNullableDataTypesShadow.EnumU64 ---> `nullable decimal` [Precision = 20 Scale = 0]
|
|
|
|
|
BuiltInNullableDataTypesShadow.Id ---> `int` [Precision = 10 Scale = 0]
|
|
|
|
|
BuiltInNullableDataTypesShadow.PartitionId ---> `int` [Precision = 10 Scale = 0]
|
|
|
|
|
BuiltInNullableDataTypesShadow.TestByteArray ---> `nullable varbinary` [MaxLength = -1]
|
|
|
|
|
BuiltInNullableDataTypesShadow.TestNullableBoolean ---> `nullable bit`
|
|
|
|
|
BuiltInNullableDataTypesShadow.TestNullableByte ---> `nullable tinyint` [Precision = 3 Scale = 0]
|
|
|
|
|
BuiltInNullableDataTypesShadow.TestNullableCharacter ---> `nullable nvarchar` [MaxLength = 1]
|
|
|
|
|
BuiltInNullableDataTypesShadow.TestNullableDateTime ---> `nullable datetime2` [Precision = 7]
|
|
|
|
|
BuiltInNullableDataTypesShadow.TestNullableDateTimeOffset ---> `nullable datetimeoffset` [Precision = 7]
|
|
|
|
|
BuiltInNullableDataTypesShadow.TestNullableDecimal ---> `nullable decimal` [Precision = 18 Scale = 2]
|
|
|
|
|
BuiltInNullableDataTypesShadow.TestNullableDouble ---> `nullable float` [Precision = 53]
|
|
|
|
|
BuiltInNullableDataTypesShadow.TestNullableInt16 ---> `nullable smallint` [Precision = 5 Scale = 0]
|
|
|
|
|
BuiltInNullableDataTypesShadow.TestNullableInt32 ---> `nullable int` [Precision = 10 Scale = 0]
|
|
|
|
|
BuiltInNullableDataTypesShadow.TestNullableInt64 ---> `nullable bigint` [Precision = 19 Scale = 0]
|
|
|
|
|
BuiltInNullableDataTypesShadow.TestNullableSignedByte ---> `nullable smallint` [Precision = 5 Scale = 0]
|
|
|
|
|
BuiltInNullableDataTypesShadow.TestNullableSingle ---> `nullable real` [Precision = 24]
|
|
|
|
|
BuiltInNullableDataTypesShadow.TestNullableTimeSpan ---> `nullable time` [Precision = 7]
|
|
|
|
|
BuiltInNullableDataTypesShadow.TestNullableUnsignedInt16 ---> `nullable int` [Precision = 10 Scale = 0]
|
|
|
|
|
BuiltInNullableDataTypesShadow.TestNullableUnsignedInt32 ---> `nullable bigint` [Precision = 19 Scale = 0]
|
|
|
|
|
BuiltInNullableDataTypesShadow.TestNullableUnsignedInt64 ---> `nullable decimal` [Precision = 20 Scale = 0]
|
|
|
|
|
BuiltInNullableDataTypesShadow.TestString ---> `nullable nvarchar` [MaxLength = -1]
|
|
|
|
|
CollectionScalar.Id ---> `int` [Precision = 10 Scale = 0]
|
|
|
|
|
CollectionScalar.Tags ---> `nullable nvarchar` [MaxLength = -1]
|
|
|
|
|
EmailTemplate.Id ---> `uniqueidentifier`
|
|
|
|
|
EmailTemplate.TemplateType ---> `int` [Precision = 10 Scale = 0]
|
|
|
|
|
EntityWithValueWrapper.Id ---> `int` [Precision = 10 Scale = 0]
|
|
|
|
|
EntityWithValueWrapper.Wrapper ---> `nullable nvarchar` [MaxLength = -1]
|
|
|
|
|
Load.Fuel ---> `float` [Precision = 53]
|
|
|
|
|
Load.LoadId ---> `int` [Precision = 10 Scale = 0]
|
|
|
|
|
MaxLengthDataTypes.ByteArray5 ---> `nullable varbinary` [MaxLength = 7]
|
|
|
|
|
MaxLengthDataTypes.ByteArray9000 ---> `nullable nvarchar` [MaxLength = -1]
|
|
|
|
|
MaxLengthDataTypes.Id ---> `int` [Precision = 10 Scale = 0]
|
|
|
|
|
MaxLengthDataTypes.String3 ---> `nullable nvarchar` [MaxLength = 12]
|
|
|
|
|
MaxLengthDataTypes.String9000 ---> `nullable varbinary` [MaxLength = -1]
|
|
|
|
|
NonNullableDependent.Id ---> `int` [Precision = 10 Scale = 0]
|
|
|
|
|
NonNullableDependent.PrincipalId ---> `int` [Precision = 10 Scale = 0]
|
|
|
|
|
NullablePrincipal.Id ---> `int` [Precision = 10 Scale = 0]
|
|
|
|
|
Order.Id ---> `nvarchar` [MaxLength = 450]
|
|
|
|
|
Person.Id ---> `int` [Precision = 10 Scale = 0]
|
|
|
|
|
Person.Name ---> `nullable nvarchar` [MaxLength = -1]
|
|
|
|
|
Person.SSN ---> `nullable int` [Precision = 10 Scale = 0]
|
|
|
|
|
Post.BlogId ---> `nullable int` [Precision = 10 Scale = 0]
|
|
|
|
|
Post.PostId ---> `int` [Precision = 10 Scale = 0]
|
|
|
|
|
SimpleCounter.CounterId ---> `int` [Precision = 10 Scale = 0]
|
|
|
|
|
SimpleCounter.Discriminator ---> `nullable nvarchar` [MaxLength = -1]
|
|
|
|
|
SimpleCounter.IsTest ---> `bit`
|
|
|
|
|
SimpleCounter.StyleKey ---> `nullable nvarchar` [MaxLength = -1]
|
|
|
|
|
StringForeignKeyDataType.Id ---> `int` [Precision = 10 Scale = 0]
|
|
|
|
|
StringForeignKeyDataType.StringKeyDataTypeId ---> `nullable nvarchar` [MaxLength = 450]
|
|
|
|
|
StringKeyDataType.Id ---> `nvarchar` [MaxLength = 450]
|
|
|
|
|
StringListDataType.Id ---> `int` [Precision = 10 Scale = 0]
|
|
|
|
|
StringListDataType.Strings ---> `nullable nvarchar` [MaxLength = -1]
|
|
|
|
|
UnicodeDataTypes.Id ---> `int` [Precision = 10 Scale = 0]
|
|
|
|
|
UnicodeDataTypes.StringAnsi ---> `nullable varchar` [MaxLength = -1]
|
|
|
|
|
UnicodeDataTypes.StringAnsi3 ---> `nullable varchar` [MaxLength = 3]
|
|
|
|
|
UnicodeDataTypes.StringAnsi9000 ---> `nullable varchar` [MaxLength = -1]
|
|
|
|
|
UnicodeDataTypes.StringDefault ---> `nullable nvarchar` [MaxLength = -1]
|
|
|
|
|
UnicodeDataTypes.StringUnicode ---> `nullable nvarchar` [MaxLength = -1]
|
|
|
|
|
User.Email ---> `nullable nvarchar` [MaxLength = -1]
|
|
|
|
|
User.Id ---> `uniqueidentifier`
|
|
|
|
|
";
|
|
|
|
|
|
|
|
|
|
Assert.Equal(expected, actual, ignoreLineEndingDifferences: true);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public class CustomConvertersJetFixture : CustomConvertersFixtureBase
|
|
|
|
|
{
|
|
|
|
|
public override bool StrictEquality => true;
|
|
|
|
|
|
|
|
|
|
public override bool SupportsAnsi => true;
|
|
|
|
|
|
|
|
|
|
public override bool SupportsUnicodeToAnsiConversion => true;
|
|
|
|
|
|
|
|
|
|
public override bool SupportsLargeStringComparisons => true;
|
|
|
|
|
|
|
|
|
|
protected override ITestStoreFactory TestStoreFactory => JetTestStoreFactory.Instance;
|
|
|
|
|
|
|
|
|
|
public override bool SupportsBinaryKeys => true;
|
|
|
|
|
|
|
|
|
|
public override bool SupportsDecimalComparisons => true;
|
|
|
|
|
|
|
|
|
|
public override DateTime DefaultDateTime => new DateTime();
|
|
|
|
|
|
|
|
|
|
public override DbContextOptionsBuilder AddOptions(DbContextOptionsBuilder builder)
|
|
|
|
|
=> base
|
|
|
|
|
.AddOptions(builder)
|
|
|
|
|
.ConfigureWarnings(
|
|
|
|
|
c => c.Log(JetEventId.DecimalTypeDefaultWarning));
|
|
|
|
|
|
|
|
|
|
protected override void OnModelCreating(ModelBuilder modelBuilder, DbContext context)
|
|
|
|
|
{
|
|
|
|
|
base.OnModelCreating(modelBuilder, context);
|
|
|
|
|
|
|
|
|
|
modelBuilder.Entity<BuiltInDataTypes>().Property(e => e.TestBoolean).IsFixedLength();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|