Skip to content

Commit c21ebba

Browse files
committed
Merge branch 'releases/4.x.x'
2 parents 590f3cc + 51f4c62 commit c21ebba

File tree

8 files changed

+75
-6
lines changed

8 files changed

+75
-6
lines changed

src/Thinktecture.EntityFrameworkCore.BulkOperations/EntityFrameworkCore/BulkOperations/ExcludingEntityPropertiesProvider.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,14 @@ public IReadOnlyList<IProperty> GetPropertiesForTempTable(IEntityType entityType
2020

2121
private IReadOnlyList<PropertyWithNavigations> Filter(IReadOnlyList<PropertyWithNavigations> properties)
2222
{
23-
return properties.Where(p => _members.All(m => m != p.Property.PropertyInfo && m != p.Property.FieldInfo))
23+
return properties.Where(p => _members.All(m => !m.IsEqualTo(p.Property.PropertyInfo)
24+
&& !m.IsEqualTo(p.Property.FieldInfo)))
2425
.ToList();
2526
}
2627

2728
private IReadOnlyList<IProperty> Filter(IReadOnlyList<IProperty> properties)
2829
{
29-
return properties.Where(p => _members.All(m => m != p.PropertyInfo && m != p.FieldInfo))
30+
return properties.Where(p => _members.All(m => !m.IsEqualTo(p.PropertyInfo) && !m.IsEqualTo(p.FieldInfo)))
3031
.ToList();
3132
}
3233

src/Thinktecture.EntityFrameworkCore.BulkOperations/Extensions/BulkOperationsCollectionExtensions.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -72,8 +72,8 @@ internal static IReadOnlyList<PropertyWithNavigations> ConvertToEntityProperties
7272

7373
private static IProperty? FindProperty(IEntityType entityType, MemberInfo memberInfo)
7474
{
75-
return entityType.GetProperties().FirstOrDefault(property => property.PropertyInfo?.MetadataToken == memberInfo.MetadataToken
76-
|| property.FieldInfo?.MetadataToken == memberInfo.MetadataToken);
75+
return entityType.GetProperties().FirstOrDefault(property => memberInfo.IsEqualTo(property.PropertyInfo)
76+
|| memberInfo.IsEqualTo(property.FieldInfo));
7777
}
7878

7979
private static INavigation? FindOwnedProperty(
@@ -82,7 +82,7 @@ internal static IReadOnlyList<PropertyWithNavigations> ConvertToEntityProperties
8282
{
8383
foreach (var ownedTypeNavi in entityType.GetOwnedTypesProperties(null)) // search for all owned properties, i.e., don't use "inlinedOwnTypes" from the caller
8484
{
85-
if (ownedTypeNavi.PropertyInfo == memberInfo || ownedTypeNavi.FieldInfo == memberInfo)
85+
if (memberInfo.IsEqualTo(ownedTypeNavi.PropertyInfo) || memberInfo.IsEqualTo(ownedTypeNavi.FieldInfo))
8686
{
8787
if (ownedTypeNavi.IsInlined())
8888
return ownedTypeNavi;
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
using System.Reflection;
2+
using System.Runtime.CompilerServices;
3+
4+
namespace Thinktecture;
5+
6+
internal static class MemberInfoExtensions
7+
{
8+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
9+
public static bool IsEqualTo(this MemberInfo member, MemberInfo? other)
10+
{
11+
return other is not null
12+
&& member.MetadataToken == other.MetadataToken
13+
&& ReferenceEquals(member.Module, other.Module);
14+
}
15+
}

tests/Thinktecture.EntityFrameworkCore.BulkOperations.Tests/EntityFrameworkCore/BulkOperations/PropertiesProviderTests/Exclude.cs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,21 @@ public void Should_extract_all_properties_besides_the_ones_specified_by_expressi
5757
properties.Should().NotContain(countProperty);
5858
}
5959

60+
[Fact]
61+
public void Should_handle_properties_from_base_classes()
62+
{
63+
var entityType = GetEntityType<TestEntityWithBaseClass>();
64+
var idProperty = entityType.FindProperty(nameof(TestEntityWithBaseClass.Id)) ?? throw new Exception("Property must no be null");
65+
var baseProperty = entityType.FindProperty(nameof(TestEntityWithBaseClass.Base_A)) ?? throw new Exception("Property must no be null");
66+
67+
var propertiesProvider = IEntityPropertiesProvider.Exclude<TestEntityWithBaseClass>(entity => new { entity.Id, entity.Base_A });
68+
69+
var properties = propertiesProvider.GetPropertiesForTempTable(entityType);
70+
properties.Should().HaveCount(entityType.GetProperties().Count() - 2);
71+
properties.Should().NotContain(idProperty);
72+
properties.Should().NotContain(baseProperty);
73+
}
74+
6075
private static IEntityType GetEntityType<T>()
6176
{
6277
var options = new DbContextOptionsBuilder<TestDbContext>().UseSqlite("DataSource=:memory:").Options;

tests/Thinktecture.EntityFrameworkCore.BulkOperations.Tests/EntityFrameworkCore/BulkOperations/PropertiesProviderTests/Include.cs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,21 @@ public void Should_extract_properties()
5555
properties.Should().Contain(countProperty);
5656
}
5757

58+
[Fact]
59+
public void Should_handle_properties_from_base_classes()
60+
{
61+
var entityType = GetEntityType<TestEntityWithBaseClass>();
62+
var idProperty = entityType.FindProperty(nameof(TestEntityWithBaseClass.Id)) ?? throw new Exception("Property must no be null");
63+
var baseProperty = entityType.FindProperty(nameof(TestEntityWithBaseClass.Base_A)) ?? throw new Exception("Property must no be null");
64+
65+
var propertiesProvider = IEntityPropertiesProvider.Include<TestEntityWithBaseClass>(entity => new { entity.Id, entity.Base_A });
66+
67+
var properties = propertiesProvider.GetPropertiesForTempTable(entityType);
68+
properties.Should().HaveCount(2);
69+
properties.Should().Contain(idProperty);
70+
properties.Should().Contain(baseProperty);
71+
}
72+
5873
private static IEntityType GetEntityType<T>()
5974
{
6075
var options = new DbContextOptionsBuilder<TestDbContext>().UseSqlite("DataSource=:memory:").Options;

tests/Thinktecture.EntityFrameworkCore.BulkOperations.Tests/TestDatabaseContext/TestDbContext.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,5 +16,7 @@ protected override void OnModelCreating(ModelBuilder modelBuilder)
1616

1717
modelBuilder.Entity<TestEntity>().Property(e => e.ConvertibleClass)
1818
.HasConversion(c => c!.Key, k => new ConvertibleClass(k));
19+
20+
TestEntityWithBaseClass.Configure(modelBuilder);
1921
}
20-
}
22+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
namespace Thinktecture.TestDatabaseContext;
2+
3+
#pragma warning disable 8618
4+
public class TestEntityBaseClass
5+
{
6+
public string Base_A { get; set; }
7+
public string Base_B { get; set; }
8+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
namespace Thinktecture.TestDatabaseContext;
2+
#pragma warning disable 8618
3+
4+
public class TestEntityWithBaseClass : TestEntityBaseClass
5+
{
6+
public Guid Id { get; set; }
7+
public Guid Description { get; set; }
8+
9+
public static void Configure(ModelBuilder modelBuilder)
10+
{
11+
modelBuilder.Entity<TestEntityWithBaseClass>();
12+
}
13+
}

0 commit comments

Comments
 (0)