簡體   English   中英

在繼承TPC中具有相同主鍵的實體

[英]Entity with same primary key in an inheritance TPC

我在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);
    }
}

當我嘗試獲取文章時會發生例外,即使每個策略都在不同的表中,也存在2個具有相同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>();
        }

這是線

listeArticle = con.ToList<Article>();

引發錯誤。

我認為答案在這里: https : //msdn.microsoft.com/zh-cn/data/jj591617.aspx#2.6

基本上,您不能擁有兩個具有相同PK的相同類型的對象(此處是您的基類)。

為此,您必須在數據庫中使用不同的種子(例如0和Int32.MinValue)設置表AuctionSelling和DirectSelling的標識。

在sql server中,所需命令為:DBCC CHECKIDENT(DirectSelling,RESEED,1000000000)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM