|
3 | 3 |
|
4 | 4 | using System.ComponentModel.DataAnnotations.Schema; |
5 | 5 | using Microsoft.EntityFrameworkCore.Cosmos.Storage.Internal; |
| 6 | +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; |
6 | 7 |
|
7 | 8 | namespace Microsoft.EntityFrameworkCore.Query; |
8 | 9 |
|
@@ -305,6 +306,86 @@ public class Product |
305 | 306 |
|
306 | 307 | #endregion 35094 |
307 | 308 |
|
| 309 | + #region 36329 |
| 310 | + |
| 311 | + [ConditionalFact] |
| 312 | + public virtual async Task Enum_discriminator_with_value_converter_on_derived_dbset() |
| 313 | + { |
| 314 | + var contextFactory = await InitializeAsync<EnumDiscriminatorContext36329>( |
| 315 | + onModelCreating: OnModelCreating36329, |
| 316 | + seed: Seed36329); |
| 317 | + |
| 318 | + await using var context = contextFactory.CreateContext(); |
| 319 | + |
| 320 | + // This should not throw an InvalidCastException |
| 321 | + var dog = await context.Dogs.SingleAsync(x => x.Id == "123"); |
| 322 | + Assert.Equal("Rover", dog.Name); |
| 323 | + Assert.Equal(PetType36329.Dog, dog.PetType); |
| 324 | + } |
| 325 | + |
| 326 | + public void OnModelCreating36329(ModelBuilder modelBuilder) |
| 327 | + { |
| 328 | + modelBuilder.Entity<Pet36329>() |
| 329 | + .ToContainer(nameof(Pet36329)) |
| 330 | + .HasPartitionKey(x => x.Id) |
| 331 | + .HasKey(x => x.Id); |
| 332 | + |
| 333 | + modelBuilder.Entity<Pet36329>().Property(e => e.PetType) |
| 334 | + .HasConversion(new EnumToStringConverter<PetType36329>()); |
| 335 | + |
| 336 | + modelBuilder.Entity<Pet36329>() |
| 337 | + .HasDiscriminator(x => x.PetType) |
| 338 | + .HasValue<Dog36329>(PetType36329.Dog); |
| 339 | + |
| 340 | + modelBuilder.Entity<Dog36329>() |
| 341 | + .HasBaseType<Pet36329>(); |
| 342 | + } |
| 343 | + |
| 344 | + protected async Task Seed36329(EnumDiscriminatorContext36329 context) |
| 345 | + { |
| 346 | + var dog = new Dog36329 |
| 347 | + { |
| 348 | + Id = "123", |
| 349 | + Name = "Rover", |
| 350 | + PetType = PetType36329.Dog, |
| 351 | + DogProperty = "test" |
| 352 | + }; |
| 353 | + |
| 354 | + await context.Dogs.AddAsync(dog); |
| 355 | + await context.SaveChangesAsync(); |
| 356 | + } |
| 357 | + |
| 358 | + public class EnumDiscriminatorContext36329 : DbContext |
| 359 | + { |
| 360 | + public EnumDiscriminatorContext36329(DbContextOptions options) |
| 361 | + : base(options) |
| 362 | + { |
| 363 | + } |
| 364 | + |
| 365 | + public DbSet<Dog36329> Dogs { get; set; } |
| 366 | + public DbSet<Pet36329> Pets { get; set; } |
| 367 | + } |
| 368 | + |
| 369 | + public abstract record Pet36329 |
| 370 | + { |
| 371 | + public string Id { get; set; } |
| 372 | + public PetType36329 PetType { get; set; } |
| 373 | + public string Name { get; set; } |
| 374 | + } |
| 375 | + |
| 376 | + public record Dog36329 : Pet36329 |
| 377 | + { |
| 378 | + public string DogProperty { get; set; } |
| 379 | + } |
| 380 | + |
| 381 | + public enum PetType36329 |
| 382 | + { |
| 383 | + Dog, |
| 384 | + Cat |
| 385 | + } |
| 386 | + |
| 387 | + #endregion 36329 |
| 388 | + |
308 | 389 | protected override string StoreName |
309 | 390 | => "AdHocMiscellaneousQueryTests"; |
310 | 391 |
|
|
0 commit comments