Skip to content

Commit 0f8c46b

Browse files
committed
Fix TryGetEntityName for interface mapped members
1 parent 90b2e99 commit 0f8c46b

12 files changed

+169
-26
lines changed

src/NHibernate.DomainModel/Northwind/Entities/User.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ public interface IUser
2626
Role Role { get; set; }
2727
EnumStoredAsString Enum1 { get; set; }
2828
EnumStoredAsInt32 Enum2 { get; set; }
29+
IUser CreatedBy { get; set; }
30+
IUser ModifiedBy { get; set; }
2931
}
3032

3133
public class User : IUser
@@ -50,6 +52,10 @@ public class User : IUser
5052

5153
public virtual EnumStoredAsInt32 Enum2 { get; set; }
5254

55+
public virtual IUser CreatedBy { get; set; }
56+
57+
public virtual IUser ModifiedBy { get; set; }
58+
5359
public User() { }
5460

5561
public User(string name, DateTime registeredAt)

src/NHibernate.DomainModel/Northwind/Mappings/User.hbm.xml

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,19 @@
77
<generator class="assigned" />
88
</id>
99

10-
<property name="Name" type="AnsiString" />
10+
<property name="Name" type="AnsiString" not-null="true" />
1111
<property name="InvalidLoginAttempts" type="Int32" />
1212
<property name="RegisteredAt" type="DateTime" />
1313
<property name="LastLoginDate" type="DateTime" />
1414

15+
<many-to-one name="CreatedBy" class="User" not-null="true" lazy="false">
16+
<column name="CreatedById" not-null="true" />
17+
</many-to-one>
18+
19+
<many-to-one name="ModifiedBy" class="User" lazy="false">
20+
<column name="ModifiedById" />
21+
</many-to-one>
22+
1523
<property name="Enum1" type="NHibernate.DomainModel.Northwind.Entities.EnumStoredAsStringType, NHibernate.DomainModel">
1624
<column name="Enum1" length="12" />
1725
</property>

src/NHibernate.Test/Async/Linq/NullComparisonTests.cs

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,12 @@ public async Task NullInequalityWithNotNullAsync()
155155

156156
await (ExpectAsync(session.Query<OrderLine>().Where(o => o.Order.Customer.CompanyName != "test"), Does.Not.Contain("is null").IgnoreCase));
157157
await (ExpectAsync(session.Query<OrderLine>().Where(o => "test" != o.Order.Customer.CompanyName), Does.Not.Contain("is null").IgnoreCase));
158+
159+
await (ExpectAsync(session.Query<User>().Where(o => o.CreatedBy.CreatedBy.CreatedBy.Name != "test"), Does.Not.Contain("is null").IgnoreCase));
160+
await (ExpectAsync(session.Query<User>().Where(o => "test" != o.CreatedBy.CreatedBy.CreatedBy.Name), Does.Not.Contain("is null").IgnoreCase));
161+
162+
await (ExpectAsync(session.Query<User>().Where(o => o.CreatedBy.CreatedBy.Id != 5), Does.Not.Contain("is null").IgnoreCase));
163+
await (ExpectAsync(session.Query<User>().Where(o => 5 != o.CreatedBy.CreatedBy.Id), Does.Not.Contain("is null").IgnoreCase));
158164
}
159165

160166
[Test]
@@ -306,12 +312,21 @@ public async Task NullEqualityWithNotNullAsync()
306312

307313
await (ExpectAsync(session.Query<Customer>().Where(o => o.CustomerId == null), Does.Contain("is null").IgnoreCase));
308314
await (ExpectAsync(session.Query<Customer>().Where(o => null == o.CustomerId), Does.Contain("is null").IgnoreCase));
315+
309316
await (ExpectAsync(session.Query<Customer>().Where(o => o.CustomerId == "test"), Does.Not.Contain("is null").IgnoreCase));
310317
await (ExpectAsync(session.Query<Customer>().Where(o => "test" == o.CustomerId), Does.Not.Contain("is null").IgnoreCase));
318+
311319
await (ExpectAsync(session.Query<OrderLine>().Where(o => o.Order.Customer.CustomerId == "test"), Does.Not.Contain("is null").IgnoreCase));
312320
await (ExpectAsync(session.Query<OrderLine>().Where(o => "test" == o.Order.Customer.CustomerId), Does.Not.Contain("is null").IgnoreCase));
321+
313322
await (ExpectAsync(session.Query<OrderLine>().Where(o => o.Order.Customer.CompanyName == "test"), Does.Not.Contain("is null").IgnoreCase));
314323
await (ExpectAsync(session.Query<OrderLine>().Where(o => "test" == o.Order.Customer.CompanyName), Does.Not.Contain("is null").IgnoreCase));
324+
325+
await (ExpectAsync(session.Query<User>().Where(o => o.CreatedBy.CreatedBy.CreatedBy.Name == "test"), Does.Not.Contain("is null").IgnoreCase));
326+
await (ExpectAsync(session.Query<User>().Where(o => "test" == o.CreatedBy.CreatedBy.CreatedBy.Name), Does.Not.Contain("is null").IgnoreCase));
327+
328+
await (ExpectAsync(session.Query<User>().Where(o => o.CreatedBy.CreatedBy.Id == 5), Does.Not.Contain("is null").IgnoreCase));
329+
await (ExpectAsync(session.Query<User>().Where(o => 5 == o.CreatedBy.CreatedBy.Id), Does.Not.Contain("is null").IgnoreCase));
315330
}
316331

317332
[Test]
@@ -416,6 +431,18 @@ public async Task NullEqualityAsync()
416431

417432
await (ExpectAsync(session.Query<User>().Where(o => "test" == o.Component.OtherComponent.OtherProperty1), Does.Not.Contain("is null").IgnoreCase));
418433
await (ExpectAsync(session.Query<User>().Where(o => o.Component.OtherComponent.OtherProperty1 == "test"), Does.Not.Contain("is null").IgnoreCase));
434+
435+
await (ExpectAsync(session.Query<User>().Where(o => o.CreatedBy.ModifiedBy.CreatedBy.Name == "test"), Does.Not.Contain("is null").IgnoreCase));
436+
await (ExpectAsync(session.Query<User>().Where(o => "test" == o.CreatedBy.ModifiedBy.CreatedBy.Name), Does.Not.Contain("is null").IgnoreCase));
437+
438+
await (ExpectAsync(session.Query<User>().Where(o => o.CreatedBy.CreatedBy.Component.OtherComponent.OtherProperty1 == "test"), Does.Not.Contain("is null").IgnoreCase));
439+
await (ExpectAsync(session.Query<User>().Where(o => "test" == o.CreatedBy.CreatedBy.Component.OtherComponent.OtherProperty1), Does.Not.Contain("is null").IgnoreCase));
440+
441+
await (ExpectAsync(session.Query<User>().Where(o => o.ModifiedBy.CreatedBy.Id == 5), Does.Not.Contain("is null").IgnoreCase));
442+
await (ExpectAsync(session.Query<User>().Where(o => 5 == o.ModifiedBy.CreatedBy.Id), Does.Not.Contain("is null").IgnoreCase));
443+
444+
await (ExpectAsync(session.Query<User>().Where(o => o.CreatedBy.ModifiedBy.Id == 5), Does.Not.Contain("is null").IgnoreCase));
445+
await (ExpectAsync(session.Query<User>().Where(o => 5 == o.CreatedBy.ModifiedBy.Id), Does.Not.Contain("is null").IgnoreCase));
419446
}
420447

421448
[Test]
@@ -492,6 +519,18 @@ public async Task NullInequalityAsync()
492519

493520
await (ExpectAsync(session.Query<User>().Where(o => "test" != o.Component.OtherComponent.OtherProperty1), Does.Contain("is null").IgnoreCase));
494521
await (ExpectAsync(session.Query<User>().Where(o => o.Component.OtherComponent.OtherProperty1 != "test"), Does.Contain("is null").IgnoreCase));
522+
523+
await (ExpectAsync(session.Query<User>().Where(o => o.CreatedBy.ModifiedBy.CreatedBy.Name != "test"), Does.Contain("is null").IgnoreCase));
524+
await (ExpectAsync(session.Query<User>().Where(o => "test" != o.CreatedBy.ModifiedBy.CreatedBy.Name), Does.Contain("is null").IgnoreCase));
525+
526+
await (ExpectAsync(session.Query<User>().Where(o => o.CreatedBy.CreatedBy.Component.OtherComponent.OtherProperty1 != "test"), Does.Contain("is null").IgnoreCase));
527+
await (ExpectAsync(session.Query<User>().Where(o => "test" != o.CreatedBy.CreatedBy.Component.OtherComponent.OtherProperty1), Does.Contain("is null").IgnoreCase));
528+
529+
await (ExpectAsync(session.Query<User>().Where(o => o.ModifiedBy.CreatedBy.Id != 5), Does.Contain("is null").IgnoreCase));
530+
await (ExpectAsync(session.Query<User>().Where(o => 5 != o.ModifiedBy.CreatedBy.Id), Does.Contain("is null").IgnoreCase));
531+
532+
await (ExpectAsync(session.Query<User>().Where(o => o.CreatedBy.ModifiedBy.Id != 5), Does.Contain("is null").IgnoreCase));
533+
await (ExpectAsync(session.Query<User>().Where(o => 5 != o.CreatedBy.ModifiedBy.Id), Does.Contain("is null").IgnoreCase));
495534
}
496535

497536
[Test]
Binary file not shown.

src/NHibernate.Test/DbScripts/MsSql2012DialectLinqReadonlyCreateScript.sql

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3774,6 +3774,8 @@ CREATE TABLE [dbo].[Users](
37743774
[Property1] [varchar](255) NULL,
37753775
[Property2] [varchar](255) NULL,
37763776
[OtherProperty1] [varchar](255) NULL,
3777+
[CreatedById] [int] NOT NULL,
3778+
[ModifiedById] [int] NULL
37773779
PRIMARY KEY CLUSTERED
37783780
(
37793781
[UserId] ASC
@@ -3783,9 +3785,9 @@ GO
37833785
SET ANSI_PADDING OFF
37843786
GO
37853787
SET IDENTITY_INSERT [dbo].[Users] ON
3786-
INSERT [dbo].[Users] ([UserId], [Name], [InvalidLoginAttempts], [RegisteredAt], [LastLoginDate], [Enum1], [Enum2], [RoleId], [Property1], [Property2], [OtherProperty1]) VALUES (1, N'ayende', 4, CAST(0x00009D9800000000 AS DateTime), NULL, N'Medium', 1, 1, N'test1', N'test2', N'othertest1')
3787-
INSERT [dbo].[Users] ([UserId], [Name], [InvalidLoginAttempts], [RegisteredAt], [LastLoginDate], [Enum1], [Enum2], [RoleId], [Property1], [Property2], [OtherProperty1]) VALUES (2, N'rahien', 5, CAST(0x00008D3E00000000 AS DateTime), NULL, N'Small', 0, 2, NULL, N'test2', NULL)
3788-
INSERT [dbo].[Users] ([UserId], [Name], [InvalidLoginAttempts], [RegisteredAt], [LastLoginDate], [Enum1], [Enum2], [Features], [RoleId], [Property1], [Property2], [OtherProperty1]) VALUES (3, N'nhibernate', 6, CAST(0x00008EAC00000000 AS DateTime), CAST(0x00009D970110B41C AS DateTime), N'Medium', 0, 8, NULL, NULL, NULL, NULL)
3788+
INSERT [dbo].[Users] ([UserId], [Name], [InvalidLoginAttempts], [RegisteredAt], [LastLoginDate], [Enum1], [Enum2], [RoleId], [Property1], [Property2], [OtherProperty1], [CreatedById], [ModifiedById]) VALUES (1, N'ayende', 4, CAST(0x00009D9800000000 AS DateTime), NULL, N'Medium', 1, 1, N'test1', N'test2', N'othertest1', 1, NULL)
3789+
INSERT [dbo].[Users] ([UserId], [Name], [InvalidLoginAttempts], [RegisteredAt], [LastLoginDate], [Enum1], [Enum2], [RoleId], [Property1], [Property2], [OtherProperty1], [CreatedById], [ModifiedById]) VALUES (2, N'rahien', 5, CAST(0x00008D3E00000000 AS DateTime), NULL, N'Small', 0, 2, NULL, N'test2', NULL, 1, NULL)
3790+
INSERT [dbo].[Users] ([UserId], [Name], [InvalidLoginAttempts], [RegisteredAt], [LastLoginDate], [Enum1], [Enum2], [Features], [RoleId], [Property1], [Property2], [OtherProperty1], [CreatedById], [ModifiedById]) VALUES (3, N'nhibernate', 6, CAST(0x00008EAC00000000 AS DateTime), CAST(0x00009D970110B41C AS DateTime), N'Medium', 0, 8, NULL, NULL, NULL, NULL, 1, NULL)
37893791
SET IDENTITY_INSERT [dbo].[Users] OFF
37903792
/****** Object: Table [dbo].[TimeSheetUsers] Script Date: 06/17/2010 13:08:54 ******/
37913793
SET ANSI_NULLS ON
Binary file not shown.

src/NHibernate.Test/Linq/NorthwindDbCreator.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,11 @@ public static void CreateMiscTestData(ISession session)
7070
}
7171
};
7272

73+
foreach (var user in users)
74+
{
75+
user.CreatedBy = user;
76+
}
77+
7378
var timesheets = new[]
7479
{
7580
new Timesheet
@@ -3707,4 +3712,4 @@ static void CreateOrderLines22(IStatelessSession session, IDictionary<int, Order
37073712
orderLine = new OrderLine { Order = ordersById[11077], Product = productsByName["Original Frankfurter grüne Soße"], UnitPrice = 13.00M, Quantity = 2, Discount = 0M }; session.Insert(orderLine);
37083713
}
37093714
}
3710-
}
3715+
}

src/NHibernate.Test/Linq/NullComparisonTests.cs

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,12 @@ public void NullInequalityWithNotNull()
143143

144144
Expect(session.Query<OrderLine>().Where(o => o.Order.Customer.CompanyName != "test"), Does.Not.Contain("is null").IgnoreCase);
145145
Expect(session.Query<OrderLine>().Where(o => "test" != o.Order.Customer.CompanyName), Does.Not.Contain("is null").IgnoreCase);
146+
147+
Expect(session.Query<User>().Where(o => o.CreatedBy.CreatedBy.CreatedBy.Name != "test"), Does.Not.Contain("is null").IgnoreCase);
148+
Expect(session.Query<User>().Where(o => "test" != o.CreatedBy.CreatedBy.CreatedBy.Name), Does.Not.Contain("is null").IgnoreCase);
149+
150+
Expect(session.Query<User>().Where(o => o.CreatedBy.CreatedBy.Id != 5), Does.Not.Contain("is null").IgnoreCase);
151+
Expect(session.Query<User>().Where(o => 5 != o.CreatedBy.CreatedBy.Id), Does.Not.Contain("is null").IgnoreCase);
146152
}
147153

148154
[Test]
@@ -294,12 +300,21 @@ public void NullEqualityWithNotNull()
294300

295301
Expect(session.Query<Customer>().Where(o => o.CustomerId == null), Does.Contain("is null").IgnoreCase);
296302
Expect(session.Query<Customer>().Where(o => null == o.CustomerId), Does.Contain("is null").IgnoreCase);
303+
297304
Expect(session.Query<Customer>().Where(o => o.CustomerId == "test"), Does.Not.Contain("is null").IgnoreCase);
298305
Expect(session.Query<Customer>().Where(o => "test" == o.CustomerId), Does.Not.Contain("is null").IgnoreCase);
306+
299307
Expect(session.Query<OrderLine>().Where(o => o.Order.Customer.CustomerId == "test"), Does.Not.Contain("is null").IgnoreCase);
300308
Expect(session.Query<OrderLine>().Where(o => "test" == o.Order.Customer.CustomerId), Does.Not.Contain("is null").IgnoreCase);
309+
301310
Expect(session.Query<OrderLine>().Where(o => o.Order.Customer.CompanyName == "test"), Does.Not.Contain("is null").IgnoreCase);
302311
Expect(session.Query<OrderLine>().Where(o => "test" == o.Order.Customer.CompanyName), Does.Not.Contain("is null").IgnoreCase);
312+
313+
Expect(session.Query<User>().Where(o => o.CreatedBy.CreatedBy.CreatedBy.Name == "test"), Does.Not.Contain("is null").IgnoreCase);
314+
Expect(session.Query<User>().Where(o => "test" == o.CreatedBy.CreatedBy.CreatedBy.Name), Does.Not.Contain("is null").IgnoreCase);
315+
316+
Expect(session.Query<User>().Where(o => o.CreatedBy.CreatedBy.Id == 5), Does.Not.Contain("is null").IgnoreCase);
317+
Expect(session.Query<User>().Where(o => 5 == o.CreatedBy.CreatedBy.Id), Does.Not.Contain("is null").IgnoreCase);
303318
}
304319

305320
[Test]
@@ -404,6 +419,18 @@ public void NullEquality()
404419

405420
Expect(session.Query<User>().Where(o => "test" == o.Component.OtherComponent.OtherProperty1), Does.Not.Contain("is null").IgnoreCase);
406421
Expect(session.Query<User>().Where(o => o.Component.OtherComponent.OtherProperty1 == "test"), Does.Not.Contain("is null").IgnoreCase);
422+
423+
Expect(session.Query<User>().Where(o => o.CreatedBy.ModifiedBy.CreatedBy.Name == "test"), Does.Not.Contain("is null").IgnoreCase);
424+
Expect(session.Query<User>().Where(o => "test" == o.CreatedBy.ModifiedBy.CreatedBy.Name), Does.Not.Contain("is null").IgnoreCase);
425+
426+
Expect(session.Query<User>().Where(o => o.CreatedBy.CreatedBy.Component.OtherComponent.OtherProperty1 == "test"), Does.Not.Contain("is null").IgnoreCase);
427+
Expect(session.Query<User>().Where(o => "test" == o.CreatedBy.CreatedBy.Component.OtherComponent.OtherProperty1), Does.Not.Contain("is null").IgnoreCase);
428+
429+
Expect(session.Query<User>().Where(o => o.ModifiedBy.CreatedBy.Id == 5), Does.Not.Contain("is null").IgnoreCase);
430+
Expect(session.Query<User>().Where(o => 5 == o.ModifiedBy.CreatedBy.Id), Does.Not.Contain("is null").IgnoreCase);
431+
432+
Expect(session.Query<User>().Where(o => o.CreatedBy.ModifiedBy.Id == 5), Does.Not.Contain("is null").IgnoreCase);
433+
Expect(session.Query<User>().Where(o => 5 == o.CreatedBy.ModifiedBy.Id), Does.Not.Contain("is null").IgnoreCase);
407434
}
408435

409436
[Test]
@@ -480,6 +507,18 @@ public void NullInequality()
480507

481508
Expect(session.Query<User>().Where(o => "test" != o.Component.OtherComponent.OtherProperty1), Does.Contain("is null").IgnoreCase);
482509
Expect(session.Query<User>().Where(o => o.Component.OtherComponent.OtherProperty1 != "test"), Does.Contain("is null").IgnoreCase);
510+
511+
Expect(session.Query<User>().Where(o => o.CreatedBy.ModifiedBy.CreatedBy.Name != "test"), Does.Contain("is null").IgnoreCase);
512+
Expect(session.Query<User>().Where(o => "test" != o.CreatedBy.ModifiedBy.CreatedBy.Name), Does.Contain("is null").IgnoreCase);
513+
514+
Expect(session.Query<User>().Where(o => o.CreatedBy.CreatedBy.Component.OtherComponent.OtherProperty1 != "test"), Does.Contain("is null").IgnoreCase);
515+
Expect(session.Query<User>().Where(o => "test" != o.CreatedBy.CreatedBy.Component.OtherComponent.OtherProperty1), Does.Contain("is null").IgnoreCase);
516+
517+
Expect(session.Query<User>().Where(o => o.ModifiedBy.CreatedBy.Id != 5), Does.Contain("is null").IgnoreCase);
518+
Expect(session.Query<User>().Where(o => 5 != o.ModifiedBy.CreatedBy.Id), Does.Contain("is null").IgnoreCase);
519+
520+
Expect(session.Query<User>().Where(o => o.CreatedBy.ModifiedBy.Id != 5), Does.Contain("is null").IgnoreCase);
521+
Expect(session.Query<User>().Where(o => 5 != o.CreatedBy.ModifiedBy.Id), Does.Contain("is null").IgnoreCase);
483522
}
484523

485524
[Test]

src/NHibernate/Linq/Visitors/NullableExpressionDetector.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,7 @@ private bool IsNullable(MemberExpression memberExpression, BinaryExpression equa
170170
}
171171

172172
var persister = _sessionFactory.GetEntityPersister(entityName);
173-
if (persister.IsIdentifierMember(memberPath))
173+
if (persister.EntityMetamodel.GetIdentifierPropertyType(memberPath) != null)
174174
{
175175
return false; // Identifier is always not null
176176
}

src/NHibernate/Persister/Entity/IEntityPersister.cs

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -641,17 +641,5 @@ public static void AfterInitialize(this IEntityPersister persister, object entit
641641
persister.AfterInitialize(entity, true, session);
642642
#pragma warning restore 618
643643
}
644-
645-
internal static bool IsIdentifierMember(this IEntityPersister entityPersister, string memberPath)
646-
{
647-
var idName = entityPersister.IdentifierPropertyName;
648-
// Composite key
649-
if (entityPersister.IdentifierType is IAbstractComponentType idComponentType)
650-
{
651-
return idComponentType.PropertyNames.Any(o => (string.IsNullOrEmpty(idName) ? o : $"{idName}.{o}") == memberPath);
652-
}
653-
654-
return idName == memberPath;
655-
}
656644
}
657645
}

src/NHibernate/Tuple/Entity/EntityMetamodel.cs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ public class EntityMetamodel
5050
private readonly CascadeStyle[] cascadeStyles;
5151

5252
private readonly IDictionary<string, int?> propertyIndexes = new Dictionary<string, int?>();
53+
private readonly IDictionary<string, IType> _identifierPropertyTypes = new Dictionary<string, IType>();
5354
private readonly bool hasCollections;
5455
private readonly bool hasMutableProperties;
5556
private readonly bool hasLazyProperties;
@@ -93,6 +94,7 @@ public EntityMetamodel(PersistentClass persistentClass, ISessionFactoryImplement
9394

9495
identifierProperty = PropertyFactory.BuildIdentifierProperty(persistentClass,
9596
sessionFactory.GetIdentifierGenerator(rootName));
97+
MapIdentifierPropertyTypes(identifierProperty);
9698

9799
versioned = persistentClass.IsVersioned;
98100

@@ -428,6 +430,29 @@ private void MapPropertyToIndex(string path, Mapping.Property prop, int i)
428430
}
429431
}
430432

433+
private void MapIdentifierPropertyTypes(IdentifierProperty identifier)
434+
{
435+
MapIdentifierPropertyTypes(identifier.Name, identifier.Type);
436+
}
437+
438+
private void MapIdentifierPropertyTypes(string path, IType propertyType)
439+
{
440+
if (!string.IsNullOrEmpty(path))
441+
{
442+
_identifierPropertyTypes[path] = propertyType;
443+
}
444+
445+
if (propertyType is IAbstractComponentType componentType)
446+
{
447+
for (var i = 0; i < componentType.PropertyNames.Length; i++)
448+
{
449+
MapIdentifierPropertyTypes(
450+
!string.IsNullOrEmpty(path) ? $"{path}.{componentType.PropertyNames[i]}" : componentType.PropertyNames[i],
451+
componentType.Subtypes[i]);
452+
}
453+
}
454+
}
455+
431456
public ISet<string> SubclassEntityNames
432457
{
433458
get { return subclassEntityNames; }
@@ -542,6 +567,11 @@ public int GetPropertyIndex(string propertyName)
542567
return null;
543568
}
544569

570+
internal IType GetIdentifierPropertyType(string memberPath)
571+
{
572+
return _identifierPropertyTypes.TryGetValue(memberPath, out var propertyType) ? propertyType : null;
573+
}
574+
545575
public bool HasCollections
546576
{
547577
get { return hasCollections; }

0 commit comments

Comments
 (0)