daryllabar / DLaB.Xrm.XrmToolBoxTools

Plugins for the XrmToolBox
MIT License
78 stars 70 forks source link

"Make reference types nullable" must use nullable type in SetRelatedEntity() #501

Open randombyte-developer opened 6 months ago

randombyte-developer commented 6 months ago

Tool and Version EarlyBoundGenerator V 2.2024.5.16

Describe the bug I wanted to try out https://github.com/daryllabar/DLaB.Xrm.XrmToolBoxTools/issues/311. It generates nullable types. When compiling the generated code there is a compile error:

Possible null reference argument for parameter 'entity' in 'void Entity.SetRelatedEntity<Contact>(string relationshipSchemaName, EntityRole? primaryEntityRole, Contact entity)'

The relevant line of code is this.SetRelatedEntity<Contact>("account_primary_contact", null, value);

value can be null in this case. SetRelatedEntity() does handle null values correctly but the nullable entity type has to be used like this: this.SetRelatedEntity<Contact?>("account_primary_contact", null, value);

To Reproduce Steps to reproduce the behavior:

  1. Generate the code for an Account with nullable types enabled.
  2. Compile it.

Expected behavior No errors.

Additional context My C# project file looks like this:

<Project Sdk="Microsoft.NET.Sdk">
    <PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
        <SignAssembly>true</SignAssembly>
        <AssemblyOriginatorKeyFile>........snk</AssemblyOriginatorKeyFile>
    </PropertyGroup>
    <PropertyGroup>
        <LangVersion>11.0</LangVersion>
        <TargetFramework>net462</TargetFramework>
        <Nullable>enable</Nullable>
        <Version>1.0.0.0</Version>
        <TreatWarningsAsErrors>true</TreatWarningsAsErrors>
    </PropertyGroup>
    <ItemGroup>
      <PackageReference Include="Microsoft.CrmSdk.CoreAssemblies" Version="9.0.2.52" />
    </ItemGroup>
</Project>
randombyte-developer commented 6 months ago

A workaround is to not enable the INotifyPropertyChanging pattern in the EBG config.

daryllabar commented 2 months ago

Looks like with the INotifyPropertyChanging, also need to null out the PropertyChanged and Property Changing events:

public event System.ComponentModel.PropertyChangedEventHandler? PropertyChanged;

public event System.ComponentModel.PropertyChangingEventHandler? PropertyChanging;
randombyte-developer commented 2 months ago

@daryllabar If there's anything to test or try out, just tell me.