Skip to content

Cannot configure different Identity column facets for different tables in TPC mapping #28195

@ajcvickers

Description

@ajcvickers

Tried to do this for value generation using Identity columns with gaps. Possibly just part of #19811, but we should check that this scenario works.

        modelBuilder.Entity<Animal>().UseTpcMappingStrategy();
        modelBuilder.Entity<Cat>().Property(e => e.Id).ValueGeneratedOnAdd().UseIdentityColumn(1, 3);
        modelBuilder.Entity<Dog>().Property(e => e.Id).ValueGeneratedOnAdd().UseIdentityColumn(2, 3);
        modelBuilder.Entity<FarmAnimal>().Property(e => e.Id).ValueGeneratedOnAdd().UseIdentityColumn(3, 3);

Tables:

      CREATE TABLE [Cats] (
          [Id] int NOT NULL,
          [Species] nvarchar(max) NULL,
          [Name] nvarchar(max) NULL,
          [EdcuationLevel] nvarchar(max) NULL,
          CONSTRAINT [PK_Cats] PRIMARY KEY ([Id])
      );

      CREATE TABLE [Dogs] (
          [Id] int NOT NULL,
          [Species] nvarchar(max) NULL,
          [Name] nvarchar(max) NULL,
          [FavoriteToy] nvarchar(max) NULL,
          CONSTRAINT [PK_Dogs] PRIMARY KEY ([Id])
      );

      CREATE TABLE [FarmAnimals] (
          [Id] int NOT NULL,
          [Species] nvarchar(max) NULL,
          [Value] decimal(18,2) NOT NULL,
          CONSTRAINT [PK_FarmAnimals] PRIMARY KEY ([Id])
      );

Full code:

public abstract class Animal
{
    public int Id { get; set; }
    public string Species { get; set; }
}

public class FarmAnimal : Animal
{
    public decimal Value { get; set; }
}

public abstract class Pet : Animal
{
    public string Name { get; set; }
}

public class Cat : Pet
{
    public string EdcuationLevel { get; set; }
}

public class Dog : Pet
{
    public string FavoriteToy { get; set; }
}


public class SomeDbContext : DbContext
{
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        => optionsBuilder
            .UseSqlServer(Your.ConnectionString)
            .LogTo(Console.WriteLine, LogLevel.Information)
            .EnableSensitiveDataLogging();

    
    public DbSet<Animal> Animals { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Animal>().UseTpcMappingStrategy();
        modelBuilder.Entity<Cat>().Property(e => e.Id).ValueGeneratedOnAdd().UseIdentityColumn(1, 3);
        modelBuilder.Entity<Dog>().Property(e => e.Id).ValueGeneratedOnAdd().UseIdentityColumn(2, 3);
        modelBuilder.Entity<FarmAnimal>().Property(e => e.Id).ValueGeneratedOnAdd().UseIdentityColumn(3, 3);
    }
}

public class Program
{
    public static void Main()
    {
        using (var context = new SomeDbContext())
        {
            context.Database.EnsureDeleted();
            context.Database.EnsureCreated();

            context.AddRange(
                new Cat {Name = "Alice", Species = "Felis catus", EdcuationLevel = "MBA"},
                new Cat {Name = "Mac", Species = "Felis catus", EdcuationLevel = "BA"},
                new Dog {Name = "Toast", Species = "Canis familiaris", FavoriteToy = "Mr. Squirrel"},
                new FarmAnimal {Value = 100.0m, Species = "Ovis aries"});

            context.SaveChanges();
        }
    }
}

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions