C# 继承TPC中具有相同主键的实体

C# 继承TPC中具有相同主键的实体,c#,entity-framework,inheritance,C#,Entity Framework,Inheritance,我在ASP.NET MVC 4中创建了一个网站,我有一个我无法理解的错误: 所有对象EntitySet“DataContext.Strategies”必须具有唯一的主键。但是,“AuctionSelling”类型的实例和“DirectSelling”类型的实例具有相同的主键值“EntitySet=Strategies”;Id=0' 这是主键的问题,但我不明白为什么会发生 我将策略TPC用于我的继承,这是我的类: public abstract class SellingStrategy {

我在ASP.NET MVC 4中创建了一个网站,我有一个我无法理解的错误:

所有对象EntitySet“DataContext.Strategies”必须具有唯一的主键。但是,“AuctionSelling”类型的实例和“DirectSelling”类型的实例具有相同的主键值“EntitySet=Strategies”;Id=0'

这是主键的问题,但我不明白为什么会发生

我将策略TPC用于我的继承,这是我的类:

public abstract class SellingStrategy
{
    public long Id { get; set; }
    public DateTime SoldDate { get; set; }
    public abstract float getSoldPrice();
}


public class DirectSelling : SellingStrategy
{
    public float SoldPrice { get; set; }

    public override float getSoldPrice()
    {
        return SoldPrice;
    }
}


public class AuctionSelling : SellingStrategy
{
    public float BasePrice { get; set; }
    public DateTime EndOfAuction { get; set; }

    public override float getSoldPrice()
    {
        return BasePrice;
    }
}
这就是我的背景:

public class DataContext : DbContext
{
    public DbSet<Article> Articles { get; set; }
    public DbSet<Utilisateur> Utilisateurs { get; set; }
    public DbSet<Adresse> Adresses { get; set; }

    public DbSet<SellingStrategy> Strategies { get; set; }

    public DataContext() : this ("DBAchatVente")
    {
    }

    public DataContext(string connectionString)
        : base(connectionString)
    {

    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        modelBuilder.Entity<Article>().HasKey<long>(a => a.Id);
        modelBuilder.Entity<Article>().Property(a => a.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
        modelBuilder.Entity<Article>().Property(a => a.Nom).IsRequired();
        modelBuilder.Entity<Article>().Property(a => a.Description).IsRequired();
        modelBuilder.Entity<Article>().Property(a => a.UrlImage).IsRequired();

        modelBuilder.Entity<Article>().Ignore(a => a.IdVendeur);
        modelBuilder.Entity<Article>().Ignore(a => a.MailVendeur);
        modelBuilder.Entity<Article>().Ignore(a => a.MotDePasseVendeur);
        modelBuilder.Entity<Article>().Ignore(a => a.AdresseLivraisonVendeur);
        modelBuilder.Entity<Article>().Ignore(a => a.AdressePaiementVendeur);
        modelBuilder.Entity<Article>().Ignore(a => a.NomVendeur);
        modelBuilder.Entity<Article>().Ignore(a => a.PrenomVendeur);

        modelBuilder.Entity<Article>().Ignore(a => a.IdAcheteur);
        modelBuilder.Entity<Article>().Ignore(a => a.MailAcheteur);
        modelBuilder.Entity<Article>().Ignore(a => a.MotDePasseAcheteur);
        modelBuilder.Entity<Article>().Ignore(a => a.AdresseLivraisonAcheteur);
        modelBuilder.Entity<Article>().Ignore(a => a.AdressePaiementAcheteur);
        modelBuilder.Entity<Article>().Ignore(a => a.NomAcheteur);
        modelBuilder.Entity<Article>().Ignore(a => a.PrenomAcheteur);

        modelBuilder.Entity<Article>().HasOptional<Utilisateur>(u => u.UserAcheteur).WithMany().WillCascadeOnDelete(false);
        modelBuilder.Entity<Article>().HasRequired<Utilisateur>(u => u.UserVendeur).WithMany().WillCascadeOnDelete(false);

        modelBuilder.Entity<Article>().HasRequired<SellingStrategy>(a => a.Strategy).WithMany().WillCascadeOnDelete(false);
        modelBuilder.Entity<SellingStrategy>().Property(s => s.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
        modelBuilder.Entity<AuctionSelling>().HasKey<long>(s => s.Id);            
        modelBuilder.Entity<AuctionSelling>().Map(m => {
            m.MapInheritedProperties();
            m.ToTable("AuctionSelling");
        });
        modelBuilder.Entity<DirectSelling>().HasKey<long>(s => s.Id);   
        modelBuilder.Entity<DirectSelling>().Map(m =>
        {
            m.MapInheritedProperties();
            m.ToTable("DirectSelling");
        });
        modelBuilder.Entity<SellingStrategy>().Property<DateTime>(s => s.SoldDate).HasColumnName("DateVente").HasColumnType("datetime2").IsOptional();


        modelBuilder.Entity<Adresse>().HasKey<long>(a => a.Id);
        modelBuilder.Entity<Adresse>().Property(a => a.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
        modelBuilder.Entity<Adresse>().Property(a => a.Rue).IsRequired();
        modelBuilder.Entity<Adresse>().Property<long>(a => a.Numero).IsRequired();
        modelBuilder.Entity<Adresse>().Property(a => a.Localite).IsRequired();
        modelBuilder.Entity<Adresse>().Property(a => a.Pays).IsRequired();

        modelBuilder.Entity<Utilisateur>().HasKey<long>(u => u.Id);
        modelBuilder.Entity<Utilisateur>().Property(u => u.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
        modelBuilder.Entity<Utilisateur>().Property(u => u.Nom).IsRequired();
        modelBuilder.Entity<Utilisateur>().Property(u => u.Prenom).IsRequired();
        modelBuilder.Entity<Utilisateur>().Property(u => u.Mail).IsRequired();
        modelBuilder.Entity<Utilisateur>().Property(u => u.MotDePasse).IsRequired();

        modelBuilder.Entity<Utilisateur>().Ignore(u => u.RuePaiement);
        modelBuilder.Entity<Utilisateur>().Ignore(u => u.NumeroPaiement);
        modelBuilder.Entity<Utilisateur>().Ignore(u => u.LocalitePaiement);
        modelBuilder.Entity<Utilisateur>().Ignore(u => u.PaysPaiement);

        modelBuilder.Entity<Utilisateur>().Ignore(u => u.RueLivraison);
        modelBuilder.Entity<Utilisateur>().Ignore(u => u.NumeroLivraison);
        modelBuilder.Entity<Utilisateur>().Ignore(u => u.LocaliteLivraison);
        modelBuilder.Entity<Utilisateur>().Ignore(u => u.PaysLivraison);

        modelBuilder.Entity<Utilisateur>().HasRequired<Adresse>(a => a.AdresseLivraison).WithMany().WillCascadeOnDelete(false);
        modelBuilder.Entity<Utilisateur>().HasRequired<Adresse>(a => a.AdressePaiement).WithMany().WillCascadeOnDelete(false);
    }
}
公共类DataContext:DbContext
{
公共DbSet项目{get;set;}
公共数据库集使用程序{get;set;}
公共数据库集地址{get;set;}
公共数据库集策略{get;set;}
public DataContext():这是(“DBAchatVente”)
{
}
公共数据上下文(字符串连接字符串)
:基本(连接字符串)
{
}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
基于模型创建(modelBuilder);
modelBuilder.Entity().HasKey(a=>a.Id);
modelBuilder.Entity().Property(a=>a.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
modelBuilder.Entity().Property(a=>a.Nom.IsRequired();
modelBuilder.Entity().Property(a=>a.Description.IsRequired();
modelBuilder.Entity().Property(a=>a.UrlImage.IsRequired();
modelBuilder.Entity().Ignore(a=>a.idvendur);
modelBuilder.Entity().Ignore(a=>a.mailvender);
modelBuilder.Entity().Ignore(a=>a.MotDePasseVendeur);
modelBuilder.Entity();
modelBuilder.Entity();
modelBuilder.Entity().Ignore(a=>a.NomVendeur);
modelBuilder.Entity().Ignore(a=>a.prenomVender);
modelBuilder.Entity().Ignore(a=>a.IdAcheteur);
modelBuilder.Entity().Ignore(a=>a.MailAcheteur);
modelBuilder.Entity();
modelBuilder.Entity();
modelBuilder.Entity();
modelBuilder.Entity().Ignore(a=>a.NomAcheteur);
modelBuilder.Entity().Ignore(a=>a.PrenomAcheteur);
modelBuilder.Entity().has可选(u=>u.UserAcheteur)。WithMany().WillCascadeOnDelete(false);
modelBuilder.Entity().HasRequired(u=>u.UserVendeur)。WithMany().WillCascadeOnDelete(false);
modelBuilder.Entity().HasRequired(a=>a.Strategy).WithMany().WillCascadeOnDelete(false);
modelBuilder.Entity().Property(s=>s.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
modelBuilder.Entity().HasKey(s=>s.Id);
modelBuilder.Entity().Map(m=>{
m、 MapInheritedProperties();
m、 ToTable(“拍卖销售”);
});
modelBuilder.Entity().HasKey(s=>s.Id);
modelBuilder.Entity().Map(m=>
{
m、 MapInheritedProperties();
m、 ToTable(“直接销售”);
});
modelBuilder.Entity().Property(s=>s.SoldDate).HasColumnName(“DateVente”).HasColumnType(“datetime2”).IsOptional();
modelBuilder.Entity().HasKey(a=>a.Id);
modelBuilder.Entity().Property(a=>a.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
modelBuilder.Entity().Property(a=>a.Rue.IsRequired();
modelBuilder.Entity().Property(a=>a.Numero.IsRequired();
modelBuilder.Entity().Property(a=>a.Localite.IsRequired();
modelBuilder.Entity().Property(a=>a.Pays.IsRequired();
modelBuilder.Entity().HasKey(u=>u.Id);
modelBuilder.Entity().Property(u=>u.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
modelBuilder.Entity().Property(u=>u.Nom.IsRequired();
modelBuilder.Entity().Property(u=>u.Prenom.IsRequired();
modelBuilder.Entity().Property(u=>u.Mail.IsRequired();
modelBuilder.Entity().Property(u=>u.MotDePasse.IsRequired();
modelBuilder.Entity().Ignore(u=>u.ruepaiment);
modelBuilder.Entity().Ignore(u=>u.NumeroPaiement);
modelBuilder.Entity();
modelBuilder.Entity().Ignore(u=>u.PaysPaiement);
modelBuilder.Entity().Ignore(u=>u.ruelivraisson);
modelBuilder.Entity();
modelBuilder.Entity();
modelBuilder.Entity().Ignore(u=>u.PaysLivraison);
modelBuilder.Entity().HasRequired(a=>a.AdresseLivraison).WithMany().WillCascadeOnDelete(false);
modelBuilder.Entity().HasRequired(a=>a.adresepaiement).WithMany().WillCascadeOnDelete(false);
}
}
当我尝试获取我的文章时会出现异常,有两篇文章的策略ID相同,即使每个策略位于不同的表中

using (DataContext context = new DataContext(connexion))
        {
            var con = from article in context.Articles.Include("UserVendeur").Include("UserAcheteur").Include("Strategy")
                      select article;
            listeArticle = con.ToList<Article>();
        }
使用(DataContext=newdatacontext(connexion))
{
var con=来自上下文中的文章.Articles.Include(“UserVendeur”).Include(“UserAcheteur”).Include(“策略”)
选择文章;
listeArticle=con.ToList();
}
这是电话线

listeArticle = con.ToList<Article>();
listeArticle=con.ToList();

这引发了错误。

我认为答案如下:

基本上,您不能有两个具有相同PK的相同类型的对象(这里是您的基类)

要实现这一点,必须使用不同的种子(例如0和Int32.MinValue)在数据库中设置表AuctionSelling和DirectSelling的标识


在sql server中,需要的命令是:DBCC CHECKIDENT(DirectSelling,RESEED,100000000)

附带说明:不要将float用于货币价值,请使用decimal。Ok的可能重复项,我刚才看到了。但是不可能按顺序拥有主键吗?因为我有一个朋友在我的同一个项目上工作但是。。它的