From 538dab208af9430fd8572add5d333960a4a2971a Mon Sep 17 00:00:00 2001 From: Andriy Svyryd Date: Wed, 1 Sep 2021 16:52:18 -0700 Subject: [PATCH] Cosmos: Don't map collections as owned types Fixes #25749 Fixes #24684 --- .../CosmosRelationshipDiscoveryConvention.cs | 4 +++- .../BuiltInDataTypesCosmosTest.cs | 6 +----- .../ModelBuilding/NonRelationshipTestBase.cs | 18 ++++++++++++++++++ 3 files changed, 22 insertions(+), 6 deletions(-) diff --git a/src/EFCore.Cosmos/Metadata/Conventions/CosmosRelationshipDiscoveryConvention.cs b/src/EFCore.Cosmos/Metadata/Conventions/CosmosRelationshipDiscoveryConvention.cs index 10a660c8c9e..5997d87deb0 100644 --- a/src/EFCore.Cosmos/Metadata/Conventions/CosmosRelationshipDiscoveryConvention.cs +++ b/src/EFCore.Cosmos/Metadata/Conventions/CosmosRelationshipDiscoveryConvention.cs @@ -40,6 +40,8 @@ public CosmosRelationshipDiscoveryConvention(ProviderConventionSetBuilderDepende /// The model. /// if the given entity type should be owned. public static bool ShouldBeOwnedType(Type targetType, IConventionModel model) - => !targetType.IsGenericType || targetType.GetGenericTypeDefinition() != typeof(List<>); + => !targetType.IsGenericType + || targetType == typeof(Dictionary) + || targetType.GetInterface(typeof(IEnumerable<>).Name) == null; } } diff --git a/test/EFCore.Cosmos.FunctionalTests/BuiltInDataTypesCosmosTest.cs b/test/EFCore.Cosmos.FunctionalTests/BuiltInDataTypesCosmosTest.cs index 0628f2380b7..0944044addb 100644 --- a/test/EFCore.Cosmos.FunctionalTests/BuiltInDataTypesCosmosTest.cs +++ b/test/EFCore.Cosmos.FunctionalTests/BuiltInDataTypesCosmosTest.cs @@ -69,7 +69,7 @@ public override void Object_to_string_conversion() base.Object_to_string_conversion(); AssertSql( - @"SELECT c[""TestSignedByte""], c[""TestByte""], c[""TestInt16""], c[""TestUnsignedInt16""], c[""TestInt32""], c[""TestUnsignedInt32""], c[""TestInt64""], c[""TestUnsignedInt64""], c[""TestSingle""], c[""TestDouble""], c[""TestDecimal""], c[""TestCharacter""], c[""TestDateTime""], c, c[""TestTimeSpan""] + @"SELECT c[""TestSignedByte""], c[""TestByte""], c[""TestInt16""], c[""TestUnsignedInt16""], c[""TestInt32""], c[""TestUnsignedInt32""], c[""TestInt64""], c[""TestUnsignedInt64""], c[""TestSingle""], c[""TestDouble""], c[""TestDecimal""], c[""TestCharacter""], c[""TestDateTime""], c[""TestDateTimeOffset""], c[""TestTimeSpan""] FROM root c WHERE ((c[""Discriminator""] = ""BuiltInDataTypes"") AND (c[""Id""] = 13))"); } @@ -117,10 +117,6 @@ protected override void OnModelCreating(ModelBuilder modelBuilder, DbContext con shadowJObject.SetConfigurationSource(ConfigurationSource.Convention); var nullableShadowJObject = (Property)modelBuilder.Entity().Property("__jObject").Metadata; nullableShadowJObject.SetConfigurationSource(ConfigurationSource.Convention); - - // Issue #24684 - modelBuilder.Entity().Ignore(e => e.TestDateTimeOffset); - modelBuilder.Entity().Ignore("TestDateTimeOffset"); } } } diff --git a/test/EFCore.Tests/ModelBuilding/NonRelationshipTestBase.cs b/test/EFCore.Tests/ModelBuilding/NonRelationshipTestBase.cs index 8c03c07a64e..492d8cc3042 100644 --- a/test/EFCore.Tests/ModelBuilding/NonRelationshipTestBase.cs +++ b/test/EFCore.Tests/ModelBuilding/NonRelationshipTestBase.cs @@ -1520,6 +1520,24 @@ protected class ThreeDee public int[,,] Three { get; set; } } + [ConditionalFact] + protected virtual void Throws_for_int_keyed_dictionary() + { + var modelBuilder = CreateModelBuilder(); + + modelBuilder.Entity(); + + Assert.Equal( + CoreStrings.EntityRequiresKey(typeof(Dictionary).ShortDisplayName()), + Assert.Throws(() => modelBuilder.FinalizeModel()).Message); + } + + protected class IntDict + { + public int Id { get; set; } + public Dictionary Notes { get; set; } + } + [ConditionalFact] public virtual void Can_set_unicode_for_properties() {