From f47eb77eea82d6e22511b9d81ac98beea7bdf7b1 Mon Sep 17 00:00:00 2001 From: AlexS Date: Mon, 24 Jul 2023 21:08:16 +0300 Subject: [PATCH] fix Equals for GenericEntityReference --- .../GenericEntityReference.cs | 29 +++- .../UserTypes/EntityReferenceUserType.cs | 5 +- .../EntityReferenceWithDisplayUserType.cs | 4 +- .../NHibernate/UserTypes/JsonUserType.cs | 2 +- .../EntityReference_Tests.cs | 127 +++++++++++------- 5 files changed, 115 insertions(+), 52 deletions(-) diff --git a/shesha-core/src/Shesha.Framework/EntityReferences/GenericEntityReference.cs b/shesha-core/src/Shesha.Framework/EntityReferences/GenericEntityReference.cs index 3fdcec781..d19b65b4a 100644 --- a/shesha-core/src/Shesha.Framework/EntityReferences/GenericEntityReference.cs +++ b/shesha-core/src/Shesha.Framework/EntityReferences/GenericEntityReference.cs @@ -7,7 +7,7 @@ namespace Shesha.EntityReferences { - public class GenericEntityReference : IGenericEntityReference + public class GenericEntityReference : IEquatable, IGenericEntityReference { private object _entity; @@ -55,5 +55,32 @@ private static GenericEntityReference SetEntity(Entity entity) { return new GenericEntityReference(entity); } + + public override bool Equals(object obj) => this.Equals(obj as GenericEntityReference); + + public bool Equals(GenericEntityReference obj) + { + return Id == obj.Id && _className == obj._className; + } + + public static bool operator ==(GenericEntityReference l, GenericEntityReference r) + { + if (l is null) + { + if (r is null) + return true; + // Only the left side is null. + return false; + } + // Equals handles case of null on right side. + return l.Equals(r); + } + + public static bool operator !=(GenericEntityReference l, GenericEntityReference r) => !(l == r); + + public override int GetHashCode() + { + return Id.IsNullOrEmpty() ? 0 : Id.GetHashCode(); + } } } diff --git a/shesha-core/src/Shesha.NHibernate/NHibernate/UserTypes/EntityReferenceUserType.cs b/shesha-core/src/Shesha.NHibernate/NHibernate/UserTypes/EntityReferenceUserType.cs index 19ab73659..49b49c01a 100644 --- a/shesha-core/src/Shesha.NHibernate/NHibernate/UserTypes/EntityReferenceUserType.cs +++ b/shesha-core/src/Shesha.NHibernate/NHibernate/UserTypes/EntityReferenceUserType.cs @@ -5,6 +5,7 @@ using Shesha.EntityReferences; using System; using System.Data.Common; +using System.Data.SqlTypes; namespace Shesha.NHibernate.UserTypes { @@ -37,8 +38,10 @@ public object Disassemble(object value, ISessionImplementor session) public new bool Equals(object x, object y) { + if (x == null && y == null) return true; + if (x is GenericEntityReference erx && y is GenericEntityReference ery) - return erx.Id == ery.Id && erx._className == ery._className; + return erx == ery; return false; } diff --git a/shesha-core/src/Shesha.NHibernate/NHibernate/UserTypes/EntityReferenceWithDisplayUserType.cs b/shesha-core/src/Shesha.NHibernate/NHibernate/UserTypes/EntityReferenceWithDisplayUserType.cs index 5b3cddbae..f79ce7d84 100644 --- a/shesha-core/src/Shesha.NHibernate/NHibernate/UserTypes/EntityReferenceWithDisplayUserType.cs +++ b/shesha-core/src/Shesha.NHibernate/NHibernate/UserTypes/EntityReferenceWithDisplayUserType.cs @@ -37,8 +37,10 @@ public object Disassemble(object value, ISessionImplementor session) public new bool Equals(object x, object y) { + if (x == null && y == null) return true; + if (x is GenericEntityReference erx && y is GenericEntityReference ery) - return erx.Id == ery.Id && erx._className == ery._className; + return erx == ery; return false; } diff --git a/shesha-core/src/Shesha.NHibernate/NHibernate/UserTypes/JsonUserType.cs b/shesha-core/src/Shesha.NHibernate/NHibernate/UserTypes/JsonUserType.cs index 4077652c4..6986f1638 100644 --- a/shesha-core/src/Shesha.NHibernate/NHibernate/UserTypes/JsonUserType.cs +++ b/shesha-core/src/Shesha.NHibernate/NHibernate/UserTypes/JsonUserType.cs @@ -63,7 +63,7 @@ public object Disassemble(object value) if (x == null && y == null) return true; - if (x == null || y == null) + if (x == null && y != null || x != null && y == null) return false; if (x is IJsonEntityProxy xp && y is IJsonEntityProxy yp) diff --git a/shesha-core/test/Shesha.Tests/EntityReferenceTest/EntityReference_Tests.cs b/shesha-core/test/Shesha.Tests/EntityReferenceTest/EntityReference_Tests.cs index eba3a9762..5a3e3cc9c 100644 --- a/shesha-core/test/Shesha.Tests/EntityReferenceTest/EntityReference_Tests.cs +++ b/shesha-core/test/Shesha.Tests/EntityReferenceTest/EntityReference_Tests.cs @@ -2,11 +2,14 @@ using Abp.Domain.Repositories; using Abp.Domain.Uow; using Abp.Timing; +using DocumentFormat.OpenXml.Vml.Office; using Shesha.Domain; using Shesha.Domain.ConfigurationItems; using Shesha.DynamicEntities; using Shesha.EntityReferences; using Shesha.Extensions; +using Shesha.NHibernate; +using Shesha.NHibernate.Session; using System; using System.ComponentModel.DataAnnotations.Schema; using System.Linq; @@ -17,7 +20,7 @@ namespace Shesha.Tests.EntityReferenceTest { public class EntityReference_Tests : SheshaNhTestBase - { + { private readonly IUnitOfWorkManager _unitOfWorkManager; private readonly IRepository _personRepository; private readonly IRepository _organisationRepository; @@ -40,12 +43,40 @@ public EntityReference_Tests() _moduleRepo = Resolve>(); } + [Fact] + public async Task TestGnericEntityReference() + { + LoginAsHostAdmin(); + + using (var uow = _unitOfWorkManager.Begin()) + { + var repo = LocalIocManager.Resolve>(); + var items = await repo.GetAllListAsync(); + + var sessionProvider = LocalIocManager.Resolve(); + var session = sessionProvider.Session; + + //GenericEntityReference i = null; + + foreach (var item in items) + { + //var b = i == item.PermissionedEntity1; + //i = item.PermissionedEntity1; + var entry = session?.GetEntry(item, false); + var dirty = session.GetDirtyProperties(item); + } + + await uow.CompleteAsync(); + } + } + [Fact] public async Task CheckUow() { LoginAsHostAdmin(); - using (var uow = _unitOfWorkManager.Begin(new UnitOfWorkOptions { + using (var uow = _unitOfWorkManager.Begin(new UnitOfWorkOptions + { IsTransactional = true, IsolationLevel = System.Transactions.IsolationLevel.ReadUncommitted })) @@ -75,70 +106,70 @@ public async Task CheckUow() } } -/* [Table("Test_EntityRef")] - public class EntityRef : Entity - { - public GenericEntityReference AnyEntity { get; set; } + /* [Table("Test_EntityRef")] + public class EntityRef : Entity + { + public GenericEntityReference AnyEntity { get; set; } - public GenericEntityReference MyEntity { get; set; } + public GenericEntityReference MyEntity { get; set; } - } + } - [Fact] - public async Task CheckUserType() - { - LoginAsHostAdmin(); + [Fact] + public async Task CheckUserType() + { + LoginAsHostAdmin(); - using (var uow = _unitOfWorkManager.Begin()) - { - EntityRef er = _entityRefRepository.GetAll().FirstOrDefault(); + using (var uow = _unitOfWorkManager.Begin()) + { + EntityRef er = _entityRefRepository.GetAll().FirstOrDefault(); - Entity anyEntity = er.AnyEntity; + Entity anyEntity = er.AnyEntity; - if (anyEntity is Person person) - { + if (anyEntity is Person person) + { - } - if (anyEntity is Organisation organisation) - { + } + if (anyEntity is Organisation organisation) + { - } + } - var entity = (Person)er.AnyEntity; + var entity = (Person)er.AnyEntity; - if (anyEntity is Person person2) - { - var name = person2.FullName; - } + if (anyEntity is Person person2) + { + var name = person2.FullName; + } - var org = _organisationRepository.GetAll().FirstOrDefault(); + var org = _organisationRepository.GetAll().FirstOrDefault(); - GenericEntityReference eref = org; - er.AnyEntity = org; - _entityRefRepository.InsertOrUpdate(er); + GenericEntityReference eref = org; + er.AnyEntity = org; + _entityRefRepository.InsertOrUpdate(er); - uow.Complete(); - } - } + uow.Complete(); + } + } - [Fact] - public async Task CheckMuliProp() - { - LoginAsHostAdmin(); + [Fact] + public async Task CheckMuliProp() + { + LoginAsHostAdmin(); - using (var uow = _unitOfWorkManager.Begin()) - { - EntityRef er = _entityRefRepository.GetAll().FirstOrDefault(); + using (var uow = _unitOfWorkManager.Begin()) + { + EntityRef er = _entityRefRepository.GetAll().FirstOrDefault(); - Entity anyEntity = er.AnyEntity; + Entity anyEntity = er.AnyEntity; - er.MyEntity = anyEntity; + er.MyEntity = anyEntity; - _entityRefRepository.InsertOrUpdate(er); + _entityRefRepository.InsertOrUpdate(er); - uow.Complete(); - } - } -*/ + uow.Complete(); + } + } + */ } } \ No newline at end of file