From af165c6da06db31896d0124df9d2d3bcd0ded16a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristoffer=20Sj=C3=B6berg?= Date: Fri, 6 Sep 2024 14:23:38 +0200 Subject: [PATCH 1/2] Add repro/test for bug 116028 --- .../CodeFirstTests.cs | 40 +++++++++++++++ .../Vehicle.cs | 50 +++++++++++++++++++ 2 files changed, 90 insertions(+) diff --git a/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/CodeFirstTests.cs b/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/CodeFirstTests.cs index fb04f751c..062320958 100644 --- a/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/CodeFirstTests.cs +++ b/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/CodeFirstTests.cs @@ -191,6 +191,46 @@ public void CallStoredProcedure() } } + /// + /// Tests for fix of http://bugs.mysql.com/bug.php?id=116028 + /// Incorrect discriminator generated column values when it's used code-first, inheritance and in a join statement + /// + [Test] + public void Bug116028_Test1() + { + #if DEBUG + Debug.WriteLine(new StackTrace().GetFrame(0).GetMethod().Name); + #endif + List vehicles; + using (VehicleDbContext4 context = new VehicleDbContext4()) + { + context.Database.Delete(); + context.Database.Initialize(true); + var manuf = context.Manufacturers.Add(new Manufacturer4 { Name = "ACME" }); + context.Vehicles.Add(new Car4 { Id = 1, Name = "Mustang", Year = 2012, CarProperty = "Car", Manufacturer = manuf }); + context.Vehicles.Add(new Bike4 { Id = 101, Name = "Mountain", Year = 2011, BikeProperty = "Bike", Manufacturer = manuf }); + context.SaveChanges(); + + vehicles = context.Manufacturers.SelectMany(v => v.Vehicles).ToList(); + + int records = -1; + using (MySqlConnection conn = new MySqlConnection(context.Database.Connection.ConnectionString)) + { + conn.Open(); + MySqlCommand cmd = new MySqlCommand("SELECT COUNT(*) FROM Vehicles", conn); + records = Convert.ToInt32(cmd.ExecuteScalar()); + } + + Assert.AreEqual(context.Vehicles.Count(), records); + } + using (VehicleDbContext4 context = new VehicleDbContext4()) + { + var vehiclesfromdb = context.Manufacturers.SelectMany(v => v.Vehicles).ToList(); + Assert.AreEqual(vehicles.OfType().Single().CarProperty, vehiclesfromdb.OfType().Single().CarProperty); + Assert.AreEqual(vehicles.OfType().Single().BikeProperty, vehiclesfromdb.OfType().Single().BikeProperty); + } + } + /// /// Tests for fix of http://bugs.mysql.com/bug.php?id=63920 /// Maxlength error when it's used code-first and inheritance (discriminator generated column) diff --git a/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/Vehicle.cs b/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/Vehicle.cs index a5b8989cb..989540721 100644 --- a/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/Vehicle.cs +++ b/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/Vehicle.cs @@ -117,7 +117,57 @@ public VehicleDbContext3() : base(CodeFirstFixture.GetEFConnectionString Vehicles { get; set; } + } + public class Vehicle4 + { + public int Id { get; set; } + public int Year { get; set; } + [MaxLength(1024)] + public string Name { get; set; } + public Guid ManufacturerId { get; set; } + [ForeignKey(nameof(ManufacturerId))] + public virtual Manufacturer4 Manufacturer { get; set; } + } + [DbConfigurationType(typeof(MySqlEFConfiguration))] + public class VehicleDbContext4 : DbContext + { + public DbSet Vehicles { get; set; } + public DbSet Manufacturers { get; set; } + + public VehicleDbContext4() : base(CodeFirstFixture.GetEFConnectionString()) + { + Database.SetInitializer(new VehicleDBInitializer4()); + + } + protected override void OnModelCreating(DbModelBuilder modelBuilder) + { + modelBuilder.Entity().ToTable("Vehicles"); + modelBuilder.Entity().ToTable("Cars"); + modelBuilder.Entity().ToTable("Bikes"); + } + } + public class VehicleDBInitializer4 : DropCreateDatabaseReallyAlways + { + } public class Accessory { [Key] From 8f3477a2de7e1e558c29e62c8e58461d2ff5297a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristoffer=20Sj=C3=B6berg?= Date: Fri, 6 Sep 2024 11:58:52 +0200 Subject: [PATCH 2/2] Use ActualColumnName property instead, fixes 116028 Fixes an issue where null is pushed to the input fragment, causing it to lose track of column renames --- EntityFramework/src/Statements/SelectStatement.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/EntityFramework/src/Statements/SelectStatement.cs b/EntityFramework/src/Statements/SelectStatement.cs index 96d8ab4ea..74e7b2fef 100644 --- a/EntityFramework/src/Statements/SelectStatement.cs +++ b/EntityFramework/src/Statements/SelectStatement.cs @@ -232,7 +232,7 @@ List GetDefaultColumnsForFragment(InputFragment input) if (generator.GetTopOp() == OpType.Join) { newColumn.ColumnAlias = cf.ColumnAlias; - newColumn.PushInput(cf.ColumnName); + newColumn.PushInput(cf.ActualColumnName); if (cf.TableName != null) newColumn.PushInput(cf.TableName); }