diff --git a/src/IntelliTect.Coalesce.Tests/TargetClasses/TestDbContext/ComplexModel.cs b/src/IntelliTect.Coalesce.Tests/TargetClasses/TestDbContext/ComplexModel.cs index 63145bcbc..68e9e57db 100644 --- a/src/IntelliTect.Coalesce.Tests/TargetClasses/TestDbContext/ComplexModel.cs +++ b/src/IntelliTect.Coalesce.Tests/TargetClasses/TestDbContext/ComplexModel.cs @@ -18,9 +18,11 @@ public class ComplexModel [DefaultOrderBy(FieldOrder = 2)] public int ComplexModelId { get; set; } +#nullable enable [InverseProperty(nameof(Test.ComplexModel))] [Search] - public ICollection Tests { get; set; } + public ICollection Tests { get; set; } = new List(); +#nullable restore /// /// Test case for foreign keys without a reference navigation prop. diff --git a/src/IntelliTect.Coalesce.Tests/Tests/TypeDefinition/PropertyViewModelTests.cs b/src/IntelliTect.Coalesce.Tests/Tests/TypeDefinition/PropertyViewModelTests.cs index d604455ee..cc01257ed 100644 --- a/src/IntelliTect.Coalesce.Tests/Tests/TypeDefinition/PropertyViewModelTests.cs +++ b/src/IntelliTect.Coalesce.Tests/Tests/TypeDefinition/PropertyViewModelTests.cs @@ -257,5 +257,21 @@ public void IsClientSerializable_IsCorrect(PropertyViewModelData data, bool expe PropertyViewModel vm = data; Assert.Equal(expected, vm.IsClientSerializable); } + + [Theory] + [PropertyViewModelData(nameof(ComplexModel.ReferenceNavigation), false)] + [PropertyViewModelData(nameof(ComplexModel.Tests), false)] + [PropertyViewModelData(nameof(ComplexModel.ComplexModelId), false)] +#if NET7_0_OR_GREATER + [PropertyViewModelData(nameof(RequiredAndInitModel.RequiredRef), true)] + [PropertyViewModelData(nameof(RequiredAndInitModel.RequiredValue), true)] + [PropertyViewModelData(nameof(RequiredAndInitModel.RequiredInitRef), true)] + [PropertyViewModelData(nameof(RequiredAndInitModel.RequiredInitValue), true)] +#endif + public void IsRequired_IsCorrect(PropertyViewModelData data, bool expected) + { + PropertyViewModel vm = data; + Assert.Equal(expected, vm.IsRequired); + } } } diff --git a/src/IntelliTect.Coalesce/TypeDefinition/PropertyViewModel.cs b/src/IntelliTect.Coalesce/TypeDefinition/PropertyViewModel.cs index cdbdf53c2..83caf9d47 100644 --- a/src/IntelliTect.Coalesce/TypeDefinition/PropertyViewModel.cs +++ b/src/IntelliTect.Coalesce/TypeDefinition/PropertyViewModel.cs @@ -307,6 +307,13 @@ public override bool IsRequired return false; } + if (!IsClientSerializable) + { + // Properties that the client never sends to the server can't be required. + // This avoids creating bogus `required` rules for things like non-nullable navigation properties. + return false; + } + if (HasRequiredKeyword) return true; if (IsCreateOnly)