Skip to content

Commit

Permalink
More EF Core changes to fix runtime errors re. nulls on value types
Browse files Browse the repository at this point in the history
  • Loading branch information
SteveDunn committed Nov 1, 2023
1 parent f956d79 commit d7b1914
Show file tree
Hide file tree
Showing 3,433 changed files with 4,460 additions and 3,885 deletions.
The diff you're trying to view is too large. We only load the first 3000 changed files.
14 changes: 13 additions & 1 deletion src/Vogen/BuildWorkItems.cs
Original file line number Diff line number Diff line change
Expand Up @@ -105,11 +105,23 @@ internal static class BuildWorkItems

var isValueType = IsUnderlyingAValueType(config);

bool isWrapperAValueType = voTypeSyntax switch
{

ClassDeclarationSyntax => false,
StructDeclarationSyntax => true,
RecordDeclarationSyntax rds when rds.IsKind(SyntaxKind.RecordDeclaration) => false,
RecordDeclarationSyntax rds when rds.IsKind(SyntaxKind.RecordStructDeclaration) => true,
_ => false
};


return new VoWorkItem
{
InstanceProperties = instanceProperties.ToList(),
TypeToAugment = voTypeSyntax,
IsValueType = isValueType,
IsTheUnderlyingAValueType = isValueType,
IsTheWrapperAValueType = isWrapperAValueType,
HasToString = toStringInfo.HasToString,
UnderlyingType = config.UnderlyingType ?? throw new InvalidOperationException("No underlying type"),
Conversions = config.Conversions,
Expand Down
2 changes: 1 addition & 1 deletion src/Vogen/Generators/ClassGenerator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,7 @@ private void EnsureInitialized()
}

private static string GenerateNullCheckIfNeeded(VoWorkItem voWorkItem) =>
voWorkItem.IsValueType ? string.Empty
voWorkItem.IsTheUnderlyingAValueType ? string.Empty
: $@" if (value is null)
{{
throw new {voWorkItem.ValidationExceptionFullName}(""Cannot create a value object with null."");
Expand Down
27 changes: 20 additions & 7 deletions src/Vogen/Generators/Conversions/GenerateEfCoreTypeConversions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,13 +20,26 @@ public string GenerateAnyBody(TypeDeclarationSyntax tds, VoWorkItem item)
Templates.TryGetForSpecificType(item.UnderlyingType, "EfCoreValueConverter") ??
Templates.GetForAnyType("EfCoreValueConverter");

code += """
public class EfCoreValueComparer : global::Microsoft.EntityFrameworkCore.ChangeTracking.ValueComparer<VOTYPE>
{
public EfCoreValueComparer() : base((left, right) => (!left._isInitialized && !right._isInitialized) || (left._isInitialized && right._isInitialized && left.Equals(right)), instance => instance._isInitialized ? instance._value.GetHashCode() : 0) { }
}
""";
if (item.IsTheWrapperAValueType)
{
code += """
public class EfCoreValueComparer : global::Microsoft.EntityFrameworkCore.ChangeTracking.ValueComparer<VOTYPE>
{
public EfCoreValueComparer() : base((left, right) => (!left._isInitialized && !right._isInitialized) || (left._isInitialized && right._isInitialized && left.Equals(right)), instance => instance._isInitialized ? instance._value.GetHashCode() : 0) { }
}
""";
}
else
{
code += """
public class EfCoreValueComparer : global::Microsoft.EntityFrameworkCore.ChangeTracking.ValueComparer<VOTYPE>
{
public EfCoreValueComparer() : base((left, right) => (left == (VOTYPE)null && right == (VOTYPE)null) || (!left._isInitialized && !right._isInitialized) || (left._isInitialized && right._isInitialized && left.Equals(right)), instance => instance._isInitialized ? instance._value.GetHashCode() : 0) { }
}
""";
}

code = code.Replace("VOTYPE", item.VoTypeName);
code = code.Replace("VOUNDERLYINGTYPE", item.UnderlyingTypeFullName);
Expand Down
2 changes: 1 addition & 1 deletion src/Vogen/Generators/RecordClassGenerator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,7 @@ private void EnsureInitialized()
}

private static string GenerateNullCheckIfNeeded(VoWorkItem voWorkItem) =>
voWorkItem.IsValueType ? string.Empty
voWorkItem.IsTheUnderlyingAValueType ? string.Empty
: $@" if (value is null)
{{
throw new {voWorkItem.ValidationExceptionFullName}(""Cannot create a value object with null."");
Expand Down
2 changes: 1 addition & 1 deletion src/Vogen/Generators/RecordStructGenerator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,7 @@ private readonly void EnsureInitialized()
}

private static string GenerateNullCheckIfNeeded(VoWorkItem voWorkItem) =>
voWorkItem.IsValueType ? string.Empty
voWorkItem.IsTheUnderlyingAValueType ? string.Empty
: $@" if (value is null)
{{
throw new {voWorkItem.ValidationExceptionFullName}(""Cannot create a value object with null."");
Expand Down
4 changes: 3 additions & 1 deletion src/Vogen/VoWorkItem.cs
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,9 @@ public INamedTypeSymbol UnderlyingType
/// </summary>
public TypeDeclarationSyntax TypeToAugment { get; init; } = null!;

public bool IsValueType { get; init; }
public bool IsTheUnderlyingAValueType { get; init; }

public bool IsTheWrapperAValueType { get; init; }

public List<InstanceProperties> InstanceProperties { get; init; } = new();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -320,7 +320,7 @@ public System.Int32 Value
}
public class EfCoreValueComparer : global::Microsoft.EntityFrameworkCore.ChangeTracking.ValueComparer<MyIntVo>
{
public EfCoreValueComparer() : base((left, right) => (!left._isInitialized && !right._isInitialized) || (left._isInitialized && right._isInitialized && left.Equals(right)), instance => instance._isInitialized ? instance._value.GetHashCode() : 0) { }
public EfCoreValueComparer() : base((left, right) => (left == (MyIntVo)null && right == (MyIntVo)null) || (!left._isInitialized && !right._isInitialized) || (left._isInitialized && right._isInitialized && left.Equals(right)), instance => instance._isInitialized ? instance._value.GetHashCode() : 0) { }
}

public class LinqToDbValueConverter : global::LinqToDB.Common.ValueConverter<MyIntVo, global::System.Int32>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -279,7 +279,7 @@ public System.Int32 Value
}
public class EfCoreValueComparer : global::Microsoft.EntityFrameworkCore.ChangeTracking.ValueComparer<MyIntVo>
{
public EfCoreValueComparer() : base((left, right) => (!left._isInitialized && !right._isInitialized) || (left._isInitialized && right._isInitialized && left.Equals(right)), instance => instance._isInitialized ? instance._value.GetHashCode() : 0) { }
public EfCoreValueComparer() : base((left, right) => (left == (MyIntVo)null && right == (MyIntVo)null) || (!left._isInitialized && !right._isInitialized) || (left._isInitialized && right._isInitialized && left.Equals(right)), instance => instance._isInitialized ? instance._value.GetHashCode() : 0) { }
}

public class LinqToDbValueConverter : global::LinqToDB.Common.ValueConverter<MyIntVo, global::System.Int32>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -320,7 +320,7 @@ public System.Int32 Value
}
public class EfCoreValueComparer : global::Microsoft.EntityFrameworkCore.ChangeTracking.ValueComparer<MyIntVo>
{
public EfCoreValueComparer() : base((left, right) => (!left._isInitialized && !right._isInitialized) || (left._isInitialized && right._isInitialized && left.Equals(right)), instance => instance._isInitialized ? instance._value.GetHashCode() : 0) { }
public EfCoreValueComparer() : base((left, right) => (left == (MyIntVo)null && right == (MyIntVo)null) || (!left._isInitialized && !right._isInitialized) || (left._isInitialized && right._isInitialized && left.Equals(right)), instance => instance._isInitialized ? instance._value.GetHashCode() : 0) { }
}

public class LinqToDbValueConverter : global::LinqToDB.Common.ValueConverter<MyIntVo, global::System.Int32>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -260,7 +260,7 @@ public System.Int32 Value
}
public class EfCoreValueComparer : global::Microsoft.EntityFrameworkCore.ChangeTracking.ValueComparer<MyIntVo>
{
public EfCoreValueComparer() : base((left, right) => (!left._isInitialized && !right._isInitialized) || (left._isInitialized && right._isInitialized && left.Equals(right)), instance => instance._isInitialized ? instance._value.GetHashCode() : 0) { }
public EfCoreValueComparer() : base((left, right) => (left == (MyIntVo)null && right == (MyIntVo)null) || (!left._isInitialized && !right._isInitialized) || (left._isInitialized && right._isInitialized && left.Equals(right)), instance => instance._isInitialized ? instance._value.GetHashCode() : 0) { }
}

public class LinqToDbValueConverter : global::LinqToDB.Common.ValueConverter<MyIntVo, global::System.Int32>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -325,7 +325,7 @@ namespace Whatever
}
public class EfCoreValueComparer : global::Microsoft.EntityFrameworkCore.ChangeTracking.ValueComparer<MyIntVo>
{
public EfCoreValueComparer() : base((left, right) => (!left._isInitialized && !right._isInitialized) || (left._isInitialized && right._isInitialized && left.Equals(right)), instance => instance._isInitialized ? instance._value.GetHashCode() : 0) { }
public EfCoreValueComparer() : base((left, right) => (left == (MyIntVo)null && right == (MyIntVo)null) || (!left._isInitialized && !right._isInitialized) || (left._isInitialized && right._isInitialized && left.Equals(right)), instance => instance._isInitialized ? instance._value.GetHashCode() : 0) { }
}

public class LinqToDbValueConverter : global::LinqToDB.Common.ValueConverter<MyIntVo, global::System.Int32>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -284,7 +284,7 @@ namespace Whatever
}
public class EfCoreValueComparer : global::Microsoft.EntityFrameworkCore.ChangeTracking.ValueComparer<MyIntVo>
{
public EfCoreValueComparer() : base((left, right) => (!left._isInitialized && !right._isInitialized) || (left._isInitialized && right._isInitialized && left.Equals(right)), instance => instance._isInitialized ? instance._value.GetHashCode() : 0) { }
public EfCoreValueComparer() : base((left, right) => (left == (MyIntVo)null && right == (MyIntVo)null) || (!left._isInitialized && !right._isInitialized) || (left._isInitialized && right._isInitialized && left.Equals(right)), instance => instance._isInitialized ? instance._value.GetHashCode() : 0) { }
}

public class LinqToDbValueConverter : global::LinqToDB.Common.ValueConverter<MyIntVo, global::System.Int32>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -325,7 +325,7 @@ namespace Whatever
}
public class EfCoreValueComparer : global::Microsoft.EntityFrameworkCore.ChangeTracking.ValueComparer<MyIntVo>
{
public EfCoreValueComparer() : base((left, right) => (!left._isInitialized && !right._isInitialized) || (left._isInitialized && right._isInitialized && left.Equals(right)), instance => instance._isInitialized ? instance._value.GetHashCode() : 0) { }
public EfCoreValueComparer() : base((left, right) => (left == (MyIntVo)null && right == (MyIntVo)null) || (!left._isInitialized && !right._isInitialized) || (left._isInitialized && right._isInitialized && left.Equals(right)), instance => instance._isInitialized ? instance._value.GetHashCode() : 0) { }
}

public class LinqToDbValueConverter : global::LinqToDB.Common.ValueConverter<MyIntVo, global::System.Int32>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -265,7 +265,7 @@ namespace Whatever
}
public class EfCoreValueComparer : global::Microsoft.EntityFrameworkCore.ChangeTracking.ValueComparer<MyIntVo>
{
public EfCoreValueComparer() : base((left, right) => (!left._isInitialized && !right._isInitialized) || (left._isInitialized && right._isInitialized && left.Equals(right)), instance => instance._isInitialized ? instance._value.GetHashCode() : 0) { }
public EfCoreValueComparer() : base((left, right) => (left == (MyIntVo)null && right == (MyIntVo)null) || (!left._isInitialized && !right._isInitialized) || (left._isInitialized && right._isInitialized && left.Equals(right)), instance => instance._isInitialized ? instance._value.GetHashCode() : 0) { }
}

public class LinqToDbValueConverter : global::LinqToDB.Common.ValueConverter<MyIntVo, global::System.Int32>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -325,7 +325,7 @@ namespace Whatever
}
public class EfCoreValueComparer : global::Microsoft.EntityFrameworkCore.ChangeTracking.ValueComparer<MyIntVo>
{
public EfCoreValueComparer() : base((left, right) => (!left._isInitialized && !right._isInitialized) || (left._isInitialized && right._isInitialized && left.Equals(right)), instance => instance._isInitialized ? instance._value.GetHashCode() : 0) { }
public EfCoreValueComparer() : base((left, right) => (left == (MyIntVo)null && right == (MyIntVo)null) || (!left._isInitialized && !right._isInitialized) || (left._isInitialized && right._isInitialized && left.Equals(right)), instance => instance._isInitialized ? instance._value.GetHashCode() : 0) { }
}

public class LinqToDbValueConverter : global::LinqToDB.Common.ValueConverter<MyIntVo, global::System.Int32>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -284,7 +284,7 @@ namespace Whatever
}
public class EfCoreValueComparer : global::Microsoft.EntityFrameworkCore.ChangeTracking.ValueComparer<MyIntVo>
{
public EfCoreValueComparer() : base((left, right) => (!left._isInitialized && !right._isInitialized) || (left._isInitialized && right._isInitialized && left.Equals(right)), instance => instance._isInitialized ? instance._value.GetHashCode() : 0) { }
public EfCoreValueComparer() : base((left, right) => (left == (MyIntVo)null && right == (MyIntVo)null) || (!left._isInitialized && !right._isInitialized) || (left._isInitialized && right._isInitialized && left.Equals(right)), instance => instance._isInitialized ? instance._value.GetHashCode() : 0) { }
}

public class LinqToDbValueConverter : global::LinqToDB.Common.ValueConverter<MyIntVo, global::System.Int32>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -325,7 +325,7 @@ namespace Whatever
}
public class EfCoreValueComparer : global::Microsoft.EntityFrameworkCore.ChangeTracking.ValueComparer<MyIntVo>
{
public EfCoreValueComparer() : base((left, right) => (!left._isInitialized && !right._isInitialized) || (left._isInitialized && right._isInitialized && left.Equals(right)), instance => instance._isInitialized ? instance._value.GetHashCode() : 0) { }
public EfCoreValueComparer() : base((left, right) => (left == (MyIntVo)null && right == (MyIntVo)null) || (!left._isInitialized && !right._isInitialized) || (left._isInitialized && right._isInitialized && left.Equals(right)), instance => instance._isInitialized ? instance._value.GetHashCode() : 0) { }
}

public class LinqToDbValueConverter : global::LinqToDB.Common.ValueConverter<MyIntVo, global::System.Int32>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -265,7 +265,7 @@ namespace Whatever
}
public class EfCoreValueComparer : global::Microsoft.EntityFrameworkCore.ChangeTracking.ValueComparer<MyIntVo>
{
public EfCoreValueComparer() : base((left, right) => (!left._isInitialized && !right._isInitialized) || (left._isInitialized && right._isInitialized && left.Equals(right)), instance => instance._isInitialized ? instance._value.GetHashCode() : 0) { }
public EfCoreValueComparer() : base((left, right) => (left == (MyIntVo)null && right == (MyIntVo)null) || (!left._isInitialized && !right._isInitialized) || (left._isInitialized && right._isInitialized && left.Equals(right)), instance => instance._isInitialized ? instance._value.GetHashCode() : 0) { }
}

public class LinqToDbValueConverter : global::LinqToDB.Common.ValueConverter<MyIntVo, global::System.Int32>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -320,7 +320,7 @@ public System.Int32 Value
}
public class EfCoreValueComparer : global::Microsoft.EntityFrameworkCore.ChangeTracking.ValueComparer<MyIntVo>
{
public EfCoreValueComparer() : base((left, right) => (!left._isInitialized && !right._isInitialized) || (left._isInitialized && right._isInitialized && left.Equals(right)), instance => instance._isInitialized ? instance._value.GetHashCode() : 0) { }
public EfCoreValueComparer() : base((left, right) => (left == (MyIntVo)null && right == (MyIntVo)null) || (!left._isInitialized && !right._isInitialized) || (left._isInitialized && right._isInitialized && left.Equals(right)), instance => instance._isInitialized ? instance._value.GetHashCode() : 0) { }
}

public class LinqToDbValueConverter : global::LinqToDB.Common.ValueConverter<MyIntVo, global::System.Int32>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -279,7 +279,7 @@ public System.Int32 Value
}
public class EfCoreValueComparer : global::Microsoft.EntityFrameworkCore.ChangeTracking.ValueComparer<MyIntVo>
{
public EfCoreValueComparer() : base((left, right) => (!left._isInitialized && !right._isInitialized) || (left._isInitialized && right._isInitialized && left.Equals(right)), instance => instance._isInitialized ? instance._value.GetHashCode() : 0) { }
public EfCoreValueComparer() : base((left, right) => (left == (MyIntVo)null && right == (MyIntVo)null) || (!left._isInitialized && !right._isInitialized) || (left._isInitialized && right._isInitialized && left.Equals(right)), instance => instance._isInitialized ? instance._value.GetHashCode() : 0) { }
}

public class LinqToDbValueConverter : global::LinqToDB.Common.ValueConverter<MyIntVo, global::System.Int32>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -320,7 +320,7 @@ public System.Int32 Value
}
public class EfCoreValueComparer : global::Microsoft.EntityFrameworkCore.ChangeTracking.ValueComparer<MyIntVo>
{
public EfCoreValueComparer() : base((left, right) => (!left._isInitialized && !right._isInitialized) || (left._isInitialized && right._isInitialized && left.Equals(right)), instance => instance._isInitialized ? instance._value.GetHashCode() : 0) { }
public EfCoreValueComparer() : base((left, right) => (left == (MyIntVo)null && right == (MyIntVo)null) || (!left._isInitialized && !right._isInitialized) || (left._isInitialized && right._isInitialized && left.Equals(right)), instance => instance._isInitialized ? instance._value.GetHashCode() : 0) { }
}

public class LinqToDbValueConverter : global::LinqToDB.Common.ValueConverter<MyIntVo, global::System.Int32>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -260,7 +260,7 @@ public System.Int32 Value
}
public class EfCoreValueComparer : global::Microsoft.EntityFrameworkCore.ChangeTracking.ValueComparer<MyIntVo>
{
public EfCoreValueComparer() : base((left, right) => (!left._isInitialized && !right._isInitialized) || (left._isInitialized && right._isInitialized && left.Equals(right)), instance => instance._isInitialized ? instance._value.GetHashCode() : 0) { }
public EfCoreValueComparer() : base((left, right) => (left == (MyIntVo)null && right == (MyIntVo)null) || (!left._isInitialized && !right._isInitialized) || (left._isInitialized && right._isInitialized && left.Equals(right)), instance => instance._isInitialized ? instance._value.GetHashCode() : 0) { }
}

public class LinqToDbValueConverter : global::LinqToDB.Common.ValueConverter<MyIntVo, global::System.Int32>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -325,7 +325,7 @@ namespace Whatever
}
public class EfCoreValueComparer : global::Microsoft.EntityFrameworkCore.ChangeTracking.ValueComparer<MyIntVo>
{
public EfCoreValueComparer() : base((left, right) => (!left._isInitialized && !right._isInitialized) || (left._isInitialized && right._isInitialized && left.Equals(right)), instance => instance._isInitialized ? instance._value.GetHashCode() : 0) { }
public EfCoreValueComparer() : base((left, right) => (left == (MyIntVo)null && right == (MyIntVo)null) || (!left._isInitialized && !right._isInitialized) || (left._isInitialized && right._isInitialized && left.Equals(right)), instance => instance._isInitialized ? instance._value.GetHashCode() : 0) { }
}

public class LinqToDbValueConverter : global::LinqToDB.Common.ValueConverter<MyIntVo, global::System.Int32>
Expand Down
Loading

0 comments on commit d7b1914

Please sign in to comment.