[英]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.