From 7ed0421624a4efcbca4fc1a16e74661f2d3ddda2 Mon Sep 17 00:00:00 2001 From: Shay Rojansky Date: Wed, 3 Aug 2022 08:22:57 +0300 Subject: [PATCH] Fix scaffolding of reference navigations with NRT (#27616) (#28382) Fixes #27496 (cherry picked from commit ec9c6c235a5a04fcc48520c4585a375b2778600d) --- .../Internal/CSharpEntityTypeGenerator.cs | 2 +- .../Internal/CSharpEntityTypeGeneratorTest.cs | 42 ++++++++++--------- 2 files changed, 24 insertions(+), 20 deletions(-) diff --git a/src/EFCore.Design/Scaffolding/Internal/CSharpEntityTypeGenerator.cs b/src/EFCore.Design/Scaffolding/Internal/CSharpEntityTypeGenerator.cs index 5c9a4f0843a..c0c107aab62 100644 --- a/src/EFCore.Design/Scaffolding/Internal/CSharpEntityTypeGenerator.cs +++ b/src/EFCore.Design/Scaffolding/Internal/CSharpEntityTypeGenerator.cs @@ -462,7 +462,7 @@ protected virtual void GenerateNavigationProperties(IEntityType entityType) _sb.AppendLine( !_useNullableReferenceTypes || navigation.IsCollection ? $"public virtual {navigationType} {navigation.Name} {{ get; set; }}" - : navigation.ForeignKey.IsRequired + : navigation.ForeignKey.IsRequired && navigation.IsOnDependent ? $"public virtual {navigationType} {navigation.Name} {{ get; set; }} = null!;" : $"public virtual {navigationType}? {navigation.Name} {{ get; set; }}"); } diff --git a/test/EFCore.Design.Tests/Scaffolding/Internal/CSharpEntityTypeGeneratorTest.cs b/test/EFCore.Design.Tests/Scaffolding/Internal/CSharpEntityTypeGeneratorTest.cs index 1e908a2042a..ebacc92b663 100644 --- a/test/EFCore.Design.Tests/Scaffolding/Internal/CSharpEntityTypeGeneratorTest.cs +++ b/test/EFCore.Design.Tests/Scaffolding/Internal/CSharpEntityTypeGeneratorTest.cs @@ -785,10 +785,27 @@ public void Required_and_not_required_reference_navigations_with_nrt() { x.Property("Id"); - x.HasOne("Dependent1", "RequiredNavigationWithReferenceForeignKey").WithOne("Entity").IsRequired(); - x.HasOne("Dependent2", "OptionalNavigationWithReferenceForeignKey").WithOne("Entity"); - x.HasOne("Dependent3", "RequiredNavigationWithValueForeignKey").WithOne("Entity").IsRequired(); - x.HasOne("Dependent4", "OptionalNavigationWithValueForeignKey").WithOne("Entity"); + x + .HasOne("Dependent1", "RequiredNavigationWithReferenceForeignKey") + .WithOne("Entity") + .HasForeignKey("Dependent1", "RequiredNavigationWithReferenceForeignKey") + .IsRequired(); + + x + .HasOne("Dependent2", "OptionalNavigationWithReferenceForeignKey") + .WithOne("Entity") + .HasForeignKey("Dependent2", "OptionalNavigationWithReferenceForeignKey"); + + x + .HasOne("Dependent3", "RequiredNavigationWithValueForeignKey") + .WithOne("Entity") + .HasForeignKey("Dependent3", "RequiredNavigationWithValueForeignKey") + .IsRequired(); + + x + .HasOne("Dependent4", "OptionalNavigationWithValueForeignKey") + .WithOne("Entity") + .HasForeignKey("Dependent4", "OptionalNavigationWithValueForeignKey"); }) .Entity("Dependent1", x => x.Property("Id")) .Entity("Dependent2", x => x.Property("Id")) @@ -810,23 +827,15 @@ public partial class Entity { [Key] public int Id { get; set; } - public string? OptionalNavigationWithReferenceForeignKeyId { get; set; } - public int? OptionalNavigationWithValueForeignKeyId { get; set; } - public string RequiredNavigationWithReferenceForeignKeyId { get; set; } = null!; - public int RequiredNavigationWithValueForeignKeyId { get; set; } - [ForeignKey(""OptionalNavigationWithReferenceForeignKeyId"")] [InverseProperty(""Entity"")] public virtual Dependent2? OptionalNavigationWithReferenceForeignKey { get; set; } - [ForeignKey(""OptionalNavigationWithValueForeignKeyId"")] [InverseProperty(""Entity"")] public virtual Dependent4? OptionalNavigationWithValueForeignKey { get; set; } - [ForeignKey(""RequiredNavigationWithReferenceForeignKeyId"")] [InverseProperty(""Entity"")] - public virtual Dependent1 RequiredNavigationWithReferenceForeignKey { get; set; } = null!; - [ForeignKey(""RequiredNavigationWithValueForeignKeyId"")] + public virtual Dependent1? RequiredNavigationWithReferenceForeignKey { get; set; } [InverseProperty(""Entity"")] - public virtual Dependent3 RequiredNavigationWithValueForeignKey { get; set; } = null!; + public virtual Dependent3? RequiredNavigationWithValueForeignKey { get; set; } } } ", @@ -836,11 +845,6 @@ public partial class Entity { var entityType = model.FindEntityType("TestNamespace.Entity"); - Assert.False(entityType.GetProperty("RequiredNavigationWithReferenceForeignKeyId").IsNullable); - Assert.True(entityType.GetProperty("OptionalNavigationWithReferenceForeignKeyId").IsNullable); - Assert.False(entityType.GetProperty("RequiredNavigationWithValueForeignKeyId").IsNullable); - Assert.True(entityType.GetProperty("OptionalNavigationWithValueForeignKeyId").IsNullable); - Assert.True(entityType.FindNavigation("RequiredNavigationWithReferenceForeignKey")!.ForeignKey.IsRequired); Assert.False(entityType.FindNavigation("OptionalNavigationWithReferenceForeignKey")!.ForeignKey.IsRequired); Assert.True(entityType.FindNavigation("RequiredNavigationWithValueForeignKey")!.ForeignKey.IsRequired);