diff --git a/src/PhenX.EntityFrameworkCore.BulkInsert/Metadata/TableMetadata.cs b/src/PhenX.EntityFrameworkCore.BulkInsert/Metadata/TableMetadata.cs index 6305790..17028b7 100644 --- a/src/PhenX.EntityFrameworkCore.BulkInsert/Metadata/TableMetadata.cs +++ b/src/PhenX.EntityFrameworkCore.BulkInsert/Metadata/TableMetadata.cs @@ -26,16 +26,32 @@ public TableMetadata(IEntityType entityType, SqlDialectBuilder dialect) Columns = GetColumns(entityType, dialect); } + private static bool CanHandleProperty(IProperty property) + { + if (property.PropertyInfo == null || property.IsShadowProperty()) + { + return false; + } + + var getMethod = property.PropertyInfo.GetGetMethod(); + if (getMethod == null || getMethod.GetParameters().Length > 0) + { + return false; + } + + return true; + } + private static ColumnMetadata[] GetColumns(IEntityType entityType, SqlDialectBuilder dialect) { var properties = entityType.GetProperties() - .Where(p => !p.IsShadowProperty()) + .Where(CanHandleProperty) .Select(x => new ColumnMetadata(x, dialect)); var complexProperties = entityType.GetComplexProperties() .SelectMany(cp => cp.ComplexType .GetProperties() - .Where(p => !p.IsShadowProperty()) + .Where(CanHandleProperty) .Select(x => new ColumnMetadata(x, dialect, cp))); return properties.Concat(complexProperties).ToArray(); diff --git a/tests/PhenX.EntityFrameworkCore.BulkInsert.Tests/DbContext/Course.cs b/tests/PhenX.EntityFrameworkCore.BulkInsert.Tests/DbContext/Course.cs new file mode 100644 index 0000000..9c08463 --- /dev/null +++ b/tests/PhenX.EntityFrameworkCore.BulkInsert.Tests/DbContext/Course.cs @@ -0,0 +1,8 @@ +namespace PhenX.EntityFrameworkCore.BulkInsert.Tests.DbContext; + +public class Course +{ + public int Id { get; set; } + public string Title { get; set; } = null!; + public ICollection Students { get; set; } = new List(); +} diff --git a/tests/PhenX.EntityFrameworkCore.BulkInsert.Tests/DbContext/Student.cs b/tests/PhenX.EntityFrameworkCore.BulkInsert.Tests/DbContext/Student.cs new file mode 100644 index 0000000..0e21a9b --- /dev/null +++ b/tests/PhenX.EntityFrameworkCore.BulkInsert.Tests/DbContext/Student.cs @@ -0,0 +1,8 @@ +namespace PhenX.EntityFrameworkCore.BulkInsert.Tests.DbContext; + +public class Student +{ + public int Id { get; set; } + public string Name { get; set; } = null!; + public ICollection Courses { get; set; } = new List(); +} diff --git a/tests/PhenX.EntityFrameworkCore.BulkInsert.Tests/DbContext/TestDbContext.cs b/tests/PhenX.EntityFrameworkCore.BulkInsert.Tests/DbContext/TestDbContext.cs index 24e0e58..f40911b 100644 --- a/tests/PhenX.EntityFrameworkCore.BulkInsert.Tests/DbContext/TestDbContext.cs +++ b/tests/PhenX.EntityFrameworkCore.BulkInsert.Tests/DbContext/TestDbContext.cs @@ -11,6 +11,8 @@ public class TestDbContext : TestDbContextBase public DbSet TestEntitiesWithGuidId { get; set; } = null!; public DbSet TestEntitiesWithConverter { get; set; } = null!; public DbSet TestEntitiesWithComplexType { get; set; } = null!; + public DbSet Students { get; set; } = null!; + public DbSet Courses { get; set; } = null!; protected override void OnModelCreating(ModelBuilder modelBuilder) { @@ -34,6 +36,21 @@ protected override void OnModelCreating(ModelBuilder modelBuilder) .ComplexProperty(e => e.OwnedComplexType) .IsRequired(); }); + + // Many-to-many with shadow property + modelBuilder.Entity() + .HasMany(s => s.Courses) + .WithMany(c => c.Students) + .UsingEntity>( + "StudentCourse", + j => j.HasOne().WithMany().HasForeignKey("CourseId"), + j => j.HasOne().WithMany().HasForeignKey("StudentId"), + j => + { + j.Property("EnrolledAt"); + j.HasKey("StudentId", "CourseId"); + } + ); } } @@ -131,6 +148,3 @@ protected override void OnModelCreating(ModelBuilder modelBuilder) }); } } - - -