From 45d66461a478e8ca25c4242476c3f2a4ba6f887e Mon Sep 17 00:00:00 2001 From: Sergei Pavlov Date: Wed, 15 Jan 2025 16:26:31 -0800 Subject: [PATCH 1/6] Convert `Node.Name` into `init` setter to avoid on-change subscriptions --- Orm/Xtensive.Orm/Orm/Model/ColumnInfo.cs | 3 +-- Orm/Xtensive.Orm/Orm/Model/Node.cs | 27 +++++------------------- 2 files changed, 6 insertions(+), 24 deletions(-) diff --git a/Orm/Xtensive.Orm/Orm/Model/ColumnInfo.cs b/Orm/Xtensive.Orm/Orm/Model/ColumnInfo.cs index aeda8d04a..c9ad70d4c 100644 --- a/Orm/Xtensive.Orm/Orm/Model/ColumnInfo.cs +++ b/Orm/Xtensive.Orm/Orm/Model/ColumnInfo.cs @@ -249,8 +249,7 @@ public override bool Equals(object obj) => /// public ColumnInfo Clone() { - ColumnInfo clone = new ColumnInfo(fld); - clone.Name = Name; + ColumnInfo clone = new(fld) { Name = Name }; clone.attributes = attributes; clone.valueType = valueType; clone.length = length; diff --git a/Orm/Xtensive.Orm/Orm/Model/Node.cs b/Orm/Xtensive.Orm/Orm/Model/Node.cs index 834e09ea9..2711902cf 100644 --- a/Orm/Xtensive.Orm/Orm/Model/Node.cs +++ b/Orm/Xtensive.Orm/Orm/Model/Node.cs @@ -15,7 +15,7 @@ namespace Xtensive.Orm.Model ///An abstract base class for model node. /// [Serializable] - public abstract class Node : LockableBase, IChangeNotifier + public abstract class Node : LockableBase { private string name; @@ -24,23 +24,16 @@ public abstract class Node : LockableBase, IChangeNotifier /// public string Name { - get { return name; } + get => name; set { EnsureNotLocked(); + if (name is not null) + throw new InvalidOperationException("The node Name is locked."); ValidateName(value); - ChangeState("Name", delegate { name = value; }); + name = value; } } - private void ChangeState(string property, Action onChangeStateDelegate) - { - if (Changing != null) - Changing(this, new ChangeNotifierEventArgs(property)); - onChangeStateDelegate(); - if (Changed != null) - Changed(this, new ChangeNotifierEventArgs(property)); - } - /// /// Performs additional custom processes before setting new name to this instance. /// @@ -49,16 +42,6 @@ protected virtual void ValidateName(string newName) { } - #region IChangeNotifier Members - - /// - public event EventHandler Changing; - - /// - public event EventHandler Changed; - - #endregion - /// /// Updates the internal state of this instance. /// From e334a637c0f665326940b941826557b2b587b1d7 Mon Sep 17 00:00:00 2001 From: Sergei Pavlov Date: Wed, 15 Jan 2025 17:13:35 -0800 Subject: [PATCH 2/6] Clone(newName) --- Orm/Xtensive.Orm/Orm/Building/Builders/IndexBuilder.cs | 3 +-- Orm/Xtensive.Orm/Orm/Building/Builders/TypeBuilder.cs | 9 ++++----- Orm/Xtensive.Orm/Orm/Model/ColumnInfo.cs | 6 +++--- Orm/Xtensive.Orm/Orm/Model/FieldInfo.cs | 6 +++--- 4 files changed, 11 insertions(+), 13 deletions(-) diff --git a/Orm/Xtensive.Orm/Orm/Building/Builders/IndexBuilder.cs b/Orm/Xtensive.Orm/Orm/Building/Builders/IndexBuilder.cs index 28b9827b2..f2b9b3e7a 100644 --- a/Orm/Xtensive.Orm/Orm/Building/Builders/IndexBuilder.cs +++ b/Orm/Xtensive.Orm/Orm/Building/Builders/IndexBuilder.cs @@ -791,8 +791,7 @@ private IEnumerable GatherValueColumns(IEnumerable colum yield return column; } else if (!column.IsSystem) { - var clone = column.Clone(); - clone.Name = nameBuilder.BuildColumnName(column); + var clone = column.Clone(nameBuilder.BuildColumnName(column)); clone.Field.MappingName = clone.Name; _ = valueColumns.Add(clone.Name); yield return clone; diff --git a/Orm/Xtensive.Orm/Orm/Building/Builders/TypeBuilder.cs b/Orm/Xtensive.Orm/Orm/Building/Builders/TypeBuilder.cs index caebfc808..bedd67d8b 100644 --- a/Orm/Xtensive.Orm/Orm/Building/Builders/TypeBuilder.cs +++ b/Orm/Xtensive.Orm/Orm/Building/Builders/TypeBuilder.cs @@ -325,7 +325,7 @@ private FieldInfo BuildDeclaredField(TypeInfo type, FieldDef fieldDef) private void BuildInheritedField(TypeInfo type, FieldInfo inheritedField) { BuildLog.Info(nameof(Strings.LogBuildingInheritedFieldXY), type.Name, inheritedField.Name); - var field = inheritedField.Clone(); + var field = inheritedField.Clone(null); type.Fields.Add(field); field.ReflectedType = type; field.DeclaringType = inheritedField.DeclaringType; @@ -343,7 +343,8 @@ private void BuildNestedFields(FieldInfo source, FieldInfo target, IEnumerable #region ICloneable methods /// - object ICloneable.Clone() => Clone(); + object ICloneable.Clone() => Clone(null); /// /// Clones this instance. /// - public ColumnInfo Clone() + public ColumnInfo Clone(string newName) { - ColumnInfo clone = new(fld) { Name = Name }; + ColumnInfo clone = new(fld) { Name = newName ?? Name }; clone.attributes = attributes; clone.valueType = valueType; clone.length = length; diff --git a/Orm/Xtensive.Orm/Orm/Model/FieldInfo.cs b/Orm/Xtensive.Orm/Orm/Model/FieldInfo.cs index b4ab9e361..71141a2ac 100644 --- a/Orm/Xtensive.Orm/Orm/Model/FieldInfo.cs +++ b/Orm/Xtensive.Orm/Orm/Model/FieldInfo.cs @@ -758,15 +758,15 @@ public override int GetHashCode() #region ICloneable methods /// - object ICloneable.Clone() => Clone(); + object ICloneable.Clone() => Clone(null); /// /// Clones this instance. /// - public FieldInfo Clone() + public FieldInfo Clone(string newName) { var clone = new FieldInfo(declaringType, reflectedType, Attributes) { - Name = Name, + Name = newName ?? Name, OriginalName = OriginalName, MappingName = MappingName, underlyingProperty = underlyingProperty, From 7b1518ae5cbc42fba77a7a332cf8f58c612e2f32 Mon Sep 17 00:00:00 2001 From: Sergei Pavlov Date: Wed, 15 Jan 2025 18:06:42 -0800 Subject: [PATCH 3/6] Fix AuxiliaryType --- Orm/Xtensive.Orm/Orm/Building/Builders/ModelBuilder.cs | 3 +-- Orm/Xtensive.Orm/Orm/Building/Builders/ModelDefBuilder.cs | 6 +++--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/Orm/Xtensive.Orm/Orm/Building/Builders/ModelBuilder.cs b/Orm/Xtensive.Orm/Orm/Building/Builders/ModelBuilder.cs index 4b83542a1..12504c0de 100644 --- a/Orm/Xtensive.Orm/Orm/Building/Builders/ModelBuilder.cs +++ b/Orm/Xtensive.Orm/Orm/Building/Builders/ModelBuilder.cs @@ -373,8 +373,7 @@ private void BuildAuxiliaryTypes(IEnumerable associations) var underlyingType = GenerateAuxiliaryType(association); // Defining auxiliary type - var underlyingTypeDef = modelDefBuilder.DefineType(underlyingType); - underlyingTypeDef.Name = association.Name; + var underlyingTypeDef = modelDefBuilder.DefineType(underlyingType, association.Name); underlyingTypeDef.MappingName = context.NameBuilder.BuildAuxiliaryTypeMappingName(association); // Copy mapping information from master type underlyingTypeDef.MappingSchema = association.OwnerType.MappingSchema; diff --git a/Orm/Xtensive.Orm/Orm/Building/Builders/ModelDefBuilder.cs b/Orm/Xtensive.Orm/Orm/Building/Builders/ModelDefBuilder.cs index b89640ad4..bde2c4d57 100644 --- a/Orm/Xtensive.Orm/Orm/Building/Builders/ModelDefBuilder.cs +++ b/Orm/Xtensive.Orm/Orm/Building/Builders/ModelDefBuilder.cs @@ -224,10 +224,10 @@ private void ProcessIndexes(TypeDef typeDef) #region Definition-related members - public TypeDef DefineType(Type type) + public TypeDef DefineType(Type type, string name = null) { var typeDef = new TypeDef(this, type, context.Validator); - typeDef.Name = context.NameBuilder.BuildTypeName(context, typeDef); + typeDef.Name = name ?? context.NameBuilder.BuildTypeName(context, typeDef); if (!(type.UnderlyingSystemType.IsInterface || type.IsAbstract)) { var sta = type.GetAttribute(AttributeSearchOptions.Default); @@ -382,4 +382,4 @@ public ModelDefBuilder(BuildingContext context) types = new Queue(context.Configuration.Types); } } -} \ No newline at end of file +} From 7171f31ec5929f654b1233f54fa72ae822def47c Mon Sep 17 00:00:00 2001 From: Sergei Pavlov Date: Wed, 15 Jan 2025 19:01:31 -0800 Subject: [PATCH 4/6] IssueJira0760_OverrideFieldNameAttributeRuinsFieldMappingOnUpgrade --- ...rideFieldNameAttributeRuinsFieldMappingOnUpgrade.cs | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0760_OverrideFieldNameAttributeRuinsFieldMappingOnUpgrade.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0760_OverrideFieldNameAttributeRuinsFieldMappingOnUpgrade.cs index e6aa9ff41..828936e7e 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0760_OverrideFieldNameAttributeRuinsFieldMappingOnUpgrade.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0760_OverrideFieldNameAttributeRuinsFieldMappingOnUpgrade.cs @@ -5,10 +5,12 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Reflection; using System.Text; using NUnit.Framework; using Xtensive.Orm.Building; using Xtensive.Orm.Building.Definitions; +using Xtensive.Orm.Model; using Xtensive.Orm.Model.Stored; using Xtensive.Orm.Tests.Issues.IssueJira0760_OverrideFieldNameAttributeRuinsFieldMappingOnUpgradeModel; using Xtensive.Orm.Upgrade; @@ -145,10 +147,12 @@ public void OnBuilt(Domain domain) public void OnDefinitionsBuilt(BuildingContext context, DomainModelDef model) { - var stateField = model.Types[typeof(EntityWithState)].Fields["State"]; - - stateField.Name = "EntityWithState.State"; + var fields = model.Types[typeof(EntityWithState)].Fields; + var stateField = fields["State"]; + fields.Remove(stateField); + typeof(Node).GetField("name", BindingFlags.Instance | BindingFlags.NonPublic).SetValue(stateField, "EntityWithState.State"); stateField.MappingName = "EntityWithState.State"; + fields.Add(stateField); } } From 40a3d927b8e1bed081678029a9efe32bea912e92 Mon Sep 17 00:00:00 2001 From: Sergei Pavlov Date: Wed, 15 Jan 2025 19:10:28 -0800 Subject: [PATCH 5/6] make setter internal --- Orm/Xtensive.Orm/Orm/Model/Node.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Orm/Xtensive.Orm/Orm/Model/Node.cs b/Orm/Xtensive.Orm/Orm/Model/Node.cs index 2711902cf..9c588f513 100644 --- a/Orm/Xtensive.Orm/Orm/Model/Node.cs +++ b/Orm/Xtensive.Orm/Orm/Model/Node.cs @@ -25,7 +25,7 @@ public abstract class Node : LockableBase public string Name { get => name; - set { + internal set { EnsureNotLocked(); if (name is not null) throw new InvalidOperationException("The node Name is locked."); From f252e3d311f7c9267b429f997c54d033e20f88f4 Mon Sep 17 00:00:00 2001 From: Sergei Pavlov Date: Thu, 16 Jan 2025 01:22:08 -0800 Subject: [PATCH 6/6] Bump version --- Version.props | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Version.props b/Version.props index 3d2a75e6a..9875c5953 100644 --- a/Version.props +++ b/Version.props @@ -2,8 +2,8 @@ - 7.2.163 - servicetitan + 7.2.164 + servicetitan-test