Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -1254,9 +1254,10 @@ private void Create(

var keyValueComparer = property.GetKeyValueComparer();
var typeMappingKeyComparer = property.GetTypeMapping().KeyComparer;
if (valueComparer != keyValueComparer
&& (!parameters.ForNativeAot || keyValueComparer != typeMappingKeyComparer)
&& (parameters.ForNativeAot || property[CoreAnnotationNames.ValueComparer] != null))
if ((valueComparer != keyValueComparer
&& (!parameters.ForNativeAot || keyValueComparer != typeMappingKeyComparer)
&& (parameters.ForNativeAot || property[CoreAnnotationNames.ValueComparer] != null))
)
{
SetValueComparer(keyValueComparer, typeMappingKeyComparer, nameof(CoreTypeMapping.KeyComparer), propertyParameters);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2483,8 +2483,42 @@ public override bool Create(
return false;
}

var defaultInstance = (RelationalTypeMapping?)CreateDefaultTypeMapping(relationalTypeMapping, parameters);
if (defaultInstance == null)
var defaultInstance = (RelationalTypeMapping)CreateDefaultTypeMapping(relationalTypeMapping, parameters);
var comparer = valueComparer ?? relationalTypeMapping.Comparer;
var keyComparer = keyValueComparer ?? relationalTypeMapping.KeyComparer;
var providerComparer = providerValueComparer ?? relationalTypeMapping.ProviderValueComparer;
var storeTypeDifferent = relationalTypeMapping.StoreType != defaultInstance.StoreType;
var sizeDifferent = relationalTypeMapping.Size != null
&& relationalTypeMapping.Size != defaultInstance.Size;
var precisionDifferent = relationalTypeMapping.Precision != null
&& relationalTypeMapping.Precision != defaultInstance.Precision;
var scaleDifferent = relationalTypeMapping.Scale != null
&& relationalTypeMapping.Scale != defaultInstance.Scale;
var dbTypeDifferent = relationalTypeMapping.DbType != null
&& relationalTypeMapping.DbType != defaultInstance.DbType;
var isUnicodeDifferent = relationalTypeMapping.IsUnicode != defaultInstance.IsUnicode;
var isFixedLengthDifferent = relationalTypeMapping.IsFixedLength != defaultInstance.IsFixedLength;
var typeDifferent = relationalTypeMapping.Converter == null
&& relationalTypeMapping.ClrType != defaultInstance.ClrType;
var storeTypePostfixDifferent = relationalTypeMapping.StoreTypePostfix != defaultInstance.StoreTypePostfix;
if (valueComparer == null
&& keyValueComparer == null
&& providerValueComparer == null
&& comparer == defaultInstance.Comparer
&& keyComparer == defaultInstance.KeyComparer
&& providerComparer == defaultInstance.ProviderValueComparer
&& !storeTypeDifferent
&& !sizeDifferent
&& !precisionDifferent
&& !scaleDifferent
&& !dbTypeDifferent
&& !isUnicodeDifferent
&& !isFixedLengthDifferent
&& relationalTypeMapping.Converter == defaultInstance.Converter
&& !typeDifferent
&& !storeTypePostfixDifferent
&& relationalTypeMapping.JsonValueReaderWriter == defaultInstance.JsonValueReaderWriter
&& relationalTypeMapping.ElementTypeMapping == defaultInstance.ElementTypeMapping)
{
return true;
}
Expand All @@ -2495,27 +2529,15 @@ public override bool Create(

mainBuilder
.Append("comparer: ");
Create(valueComparer ?? relationalTypeMapping.Comparer, parameters, code);
Create(comparer, parameters, code);

mainBuilder.AppendLine(",")
.Append("keyComparer: ");
Create(keyValueComparer ?? relationalTypeMapping.KeyComparer, parameters, code);
Create(keyComparer, parameters, code);

mainBuilder.AppendLine(",")
.Append("providerValueComparer: ");
Create(providerValueComparer ?? relationalTypeMapping.ProviderValueComparer, parameters, code);

var storeTypeDifferent = relationalTypeMapping.StoreType != defaultInstance.StoreType;
var sizeDifferent = relationalTypeMapping.Size != null
&& relationalTypeMapping.Size != defaultInstance.Size;
var precisionDifferent = relationalTypeMapping.Precision != null
&& relationalTypeMapping.Precision != defaultInstance.Precision;
var scaleDifferent = relationalTypeMapping.Scale != null
&& relationalTypeMapping.Scale != defaultInstance.Scale;
var dbTypeDifferent = relationalTypeMapping.DbType != null
&& relationalTypeMapping.DbType != defaultInstance.DbType;
var isUnicodeDifferent = relationalTypeMapping.IsUnicode != defaultInstance.IsUnicode;
var isFixedLengthDifferent = relationalTypeMapping.IsFixedLength != defaultInstance.IsFixedLength;
Create(providerComparer, parameters, code);
if (storeTypeDifferent
|| sizeDifferent
|| precisionDifferent
Expand Down Expand Up @@ -2586,15 +2608,12 @@ public override bool Create(
Create(relationalTypeMapping.Converter, parameters, code);
}

var typeDifferent = relationalTypeMapping.Converter == null
&& relationalTypeMapping.ClrType != defaultInstance.ClrType;
if (typeDifferent)
{
mainBuilder.AppendLine(",")
.Append($"clrType: {code.Literal(relationalTypeMapping.ClrType)}");
}

var storeTypePostfixDifferent = relationalTypeMapping.StoreTypePostfix != defaultInstance.StoreTypePostfix;
if (storeTypePostfixDifferent)
{
mainBuilder.AppendLine(",")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -586,6 +586,27 @@ public static void CreateJsonValueReaderWriter(
}
}

/// <inheritdoc />
public virtual bool Create(
CoreTypeMapping typeMapping,
IProperty property,
CSharpRuntimeAnnotationCodeGeneratorParameters parameters)
{
var keyValueComparer = property.GetKeyValueComparer();
var typeMappingKeyComparer = property.GetTypeMapping().KeyComparer;
keyValueComparer = parameters.ForNativeAot
&& (property.IsKey()
|| property.IsForeignKey()
|| property.IsUniqueIndex())
&& keyValueComparer == typeMappingKeyComparer
&& keyValueComparer.IsDefault()
&& keyValueComparer.Type == property.ClrType
? keyValueComparer
: null;

return Create(typeMapping, parameters, keyValueComparer: keyValueComparer);
}

/// <inheritdoc />
public virtual bool Create(
CoreTypeMapping typeMapping,
Expand All @@ -597,7 +618,21 @@ public virtual bool Create(
var mainBuilder = parameters.MainBuilder;
var code = Dependencies.CSharpHelper;
var defaultInstance = CreateDefaultTypeMapping(typeMapping, parameters);
if (defaultInstance == null)
var comparer = valueComparer ?? typeMapping.Comparer;
var keyComparer = keyValueComparer ?? typeMapping.KeyComparer;
var providerComparer = providerValueComparer ?? typeMapping.ProviderValueComparer;
var typeDifferent = typeMapping.Converter == null
&& typeMapping.ClrType != defaultInstance.ClrType;
if (valueComparer == null
&& keyValueComparer == null
&& providerValueComparer == null
&& comparer == defaultInstance.Comparer
&& keyComparer == defaultInstance.KeyComparer
&& providerComparer == defaultInstance.ProviderValueComparer
&& typeMapping.Converter == defaultInstance.Converter
&& !typeDifferent
&& typeMapping.JsonValueReaderWriter == defaultInstance.JsonValueReaderWriter
&& typeMapping.ElementTypeMapping == defaultInstance.ElementTypeMapping)
{
return true;
}
Expand All @@ -608,15 +643,15 @@ public virtual bool Create(

mainBuilder
.Append("comparer: ");
Create(valueComparer ?? typeMapping.Comparer, parameters, code);
Create(comparer, parameters, code);

mainBuilder.AppendLine(",")
.Append("keyComparer: ");
Create(keyValueComparer ?? typeMapping.KeyComparer, parameters, code);
Create(keyComparer, parameters, code);

mainBuilder.AppendLine(",")
.Append("providerValueComparer: ");
Create(providerValueComparer ?? typeMapping.ProviderValueComparer, parameters, code);
Create(providerComparer, parameters, code);

if (typeMapping.Converter != null
&& typeMapping.Converter != defaultInstance.Converter)
Expand All @@ -627,8 +662,6 @@ public virtual bool Create(
Create(typeMapping.Converter, parameters, code);
}

var typeDifferent = typeMapping.Converter == null
&& typeMapping.ClrType != defaultInstance.ClrType;
if (typeDifferent)
{
mainBuilder.AppendLine(",")
Expand Down Expand Up @@ -666,7 +699,7 @@ public virtual bool Create(
/// any release. You should only use it directly in your code with extreme caution and knowing that
/// doing so can result in application failures when updating to a new Entity Framework Core release.
/// </summary>
protected virtual CoreTypeMapping? CreateDefaultTypeMapping(
protected virtual CoreTypeMapping CreateDefaultTypeMapping(
CoreTypeMapping typeMapping,
CSharpRuntimeAnnotationCodeGeneratorParameters parameters)
{
Expand All @@ -689,7 +722,6 @@ public virtual bool Create(
.Append(code.Reference(typeMappingType))
.Append(".Default");

var defaultInstance = (CoreTypeMapping)defaultProperty.GetValue(null)!;
return typeMapping == defaultInstance ? null : defaultInstance;
return (CoreTypeMapping)defaultProperty.GetValue(null)!;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
// <auto-generated />
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using TestNamespace;

#pragma warning disable 219, 612, 618
#nullable disable

[assembly: DbContextModel(typeof(DbContext), typeof(DbContextModel), ProviderName = "Microsoft.EntityFrameworkCore.InMemory")]
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
// <auto-generated />
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Metadata;

#pragma warning disable 219, 612, 618
#nullable disable

namespace TestNamespace;

[DbContext(typeof(DbContext))]
public partial class DbContextModel : RuntimeModel
{
private static readonly bool _useOldBehavior31751 =
System.AppContext.TryGetSwitch("Microsoft.EntityFrameworkCore.Issue31751", out var enabled31751) && enabled31751;

static DbContextModel()
{
var model = new DbContextModel();

if (_useOldBehavior31751)
{
model.Initialize();
}
else
{
var thread = new System.Threading.Thread(RunInitialization, 10 * 1024 * 1024);
thread.Start();
thread.Join();

void RunInitialization()
{
model.Initialize();
}
}

model.Customize();
_instance = (DbContextModel)model.FinalizeModel();
}

private static DbContextModel _instance;
public static IModel Instance => _instance;

partial void Initialize();

partial void Customize();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
// <auto-generated />
using System;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Metadata;

#pragma warning disable 219, 612, 618
#nullable disable

namespace TestNamespace;

public partial class DbContextModel
{
private DbContextModel()
: base(skipDetectChanges: false, modelId: new Guid("00000000-0000-0000-0000-000000000000"), entityTypeCount: 1)
{
}

partial void Initialize()
{
var index = IndexEntityType.Create(this);

IndexEntityType.CreateAnnotations(index);

}
}
Loading