Violação de Chave Primária: Herança usando o Código EF First

Eu tenho seguindo o primeiro código do código EF. Eu estou recebendo a seguinte exceção:

'GiftCouponPayment' não contém uma coluna de identidade.

As tabelas são criadas com sucesso no banco de dados. No entanto, como posso me livrar dessa exceção? Além disso, qual é o motivo dessa exceção?

Nota: Eu estou bem com qualquer esquema de tabela, desde que o modelo de domínio (descrito usando o código primeiro) seja mantido (e os dados possam ser consultados).

Depois de continuar esta exceção, há uma outra exceção como abaixo:

Ocorreu um erro ao salvar entidades que não expõem propriedades de chave estrangeira para seus relacionamentos. A propriedade EntityEntries retornará null porque uma única entidade não pode ser identificada como a origem da exceção. O tratamento de exceções durante o salvamento pode ser facilitado pela exposição de propriedades de chaves estrangeiras em seus tipos de entidades. Consulte a exceção interna para obter detalhes.

{"Violação da restrição PRIMARY KEY 'PK_dbo.PaymentComponent'. Não é possível inserir chave duplicada no objeto 'dbo.PaymentComponent'. \ R \ nA instrução foi encerrada."}

Referência:

Entity Framework: divide a tabela em várias tabelas

Nota: O esquema do banco de dados resultante é mostrado abaixo.

Código:

public class MyInitializer : CreateDatabaseIfNotExists<NerdDinners>
{
    //Only one identity column can be created per table.
    protected override void Seed(NerdDinners context)
    {
        //context.Database.ExecuteSqlCommand("CREATE UNIQUE INDEX IX_Payment_PayedTime ON Payment (PayedTime)");
        context.Database.ExecuteSqlCommand("DBCC CHECKIDENT ('Payment', RESEED, 1)");
        context.Database.ExecuteSqlCommand("DBCC CHECKIDENT ('GiftCouponPayment', RESEED, 2)");
        context.Database.ExecuteSqlCommand("DBCC CHECKIDENT ('ClubCardPayment', RESEED, 3)");
    }
}

//System.Data.Entity.DbContext is from EntityFramework.dll
public class NerdDinners : System.Data.Entity.DbContext
{
    public NerdDinners(string connString): base(connString)
    { 
    }

    protected override void OnModelCreating(DbModelBuilder modelbuilder)
    {
        //Fluent API - Plural Removal
        modelbuilder.Conventions.Remove<PluralizingTableNameConvention>();

        //Fluent API - Table per Concrete Type (TPC)
        modelbuilder.Entity<GiftCouponPayment>()
            .Map(m =>
            {
                m.MapInheritedProperties();
                m.ToTable("GiftCouponPayment");
            });

        modelbuilder.Entity<ClubCardPayment>()
            .Map(m =>
            {
                m.MapInheritedProperties();
                m.ToTable("ClubCardPayment");
            });
    }

    public DbSet<GiftCouponPayment> GiftCouponPayments { get; set; }
    public DbSet<ClubCardPayment> ClubCardPayments { get; set; }
    public DbSet<Payment> Payments { get; set; }
}

public abstract class PaymentComponent
{
    public int PaymentComponentID { get; set; }
    public int MyValue { get; set; }
    public abstract int GetEffectiveValue();
}

public partial class GiftCouponPayment : PaymentComponent
{
    public override int GetEffectiveValue()
    {
        if (MyValue < 2000)
        {
            return 0;
        }
        return MyValue;
    }
}

public partial class ClubCardPayment : PaymentComponent
{
    public override int GetEffectiveValue()
    {
        return MyValue;
    }
}

public partial class Payment
{
    public int PaymentID { get; set; }
    public List<PaymentComponent> PaymentComponents { get; set; }
    public DateTime PayedTime { get; set; }
}

Cliente:

    static void Main(string[] args)
    {
        Database.SetInitializer<NerdDinners>(new MyInitializer());
        string connectionstring = "Data Source=.;Initial Catalog=NerdDinners;Integrated Security=True;Connect Timeout=30";

        using (var db = new NerdDinners(connectionstring))
        {
            GiftCouponPayment giftCouponPayment = new GiftCouponPayment();
            giftCouponPayment.MyValue=250;

            ClubCardPayment clubCardPayment = new ClubCardPayment();
            clubCardPayment.MyValue = 5000;

            List<PaymentComponent> comps = new List<PaymentComponent>();
            comps.Add(giftCouponPayment);
            comps.Add(clubCardPayment);

            var payment = new Payment { PaymentComponents = comps, PayedTime=DateTime.Now };
            db.Payments.Add(payment);

            int recordsAffected = db.SaveChanges();
        }
    }

questionAnswers(3)

yourAnswerToTheQuestion