EF 6.1.3 - Cannot insert duplicate key in object

asp.net entity-framework entity-framework-6

Question

I searched on site for solving my problem, but I still haven't solved it. I have 2 entities:

public class Article
{
    [Key]
    public Guid ID { get; set; }
    public Guid? ApprovedBy_ID { get; set; }
    public Guid CreatedBy_ID { get; set; }
    public virtual Profile ApprovedBy { get; set; }
    public virtual Profile CreatedBy { get; set; }
    //New guid for new article
    public Article()
    {
        ID = Guid.NewGuid();
    }
}
public class Profile
{
    [Key]
    public Guid ID { get; set; }
    [Required]
    [StringLength(100)]
    public string FullName { get; set; }
    public Profile()
    {
        ID = Guid.NewGuid();
    }
}

And here is my insert-logic:

    private readonly iContext context;
    public ArticleLogic()
    {
        context = new iContext();
    }
    public IEnumerable<Article> GetAllArticle()
    {
        return context.Articles.Include("Categories").Include("Pictures").Include("ApprovedBy").Include("CreatedBy").Include("Template");
    }

    public Article AddArticle(Article article)
    {
            try
            {
                Profile pf = context.Profiles.First();
                context.Profiles.Attach(pf);

                Article art = new Article();
                art.Title = article.Title;
                art.Description = article.Description;
                art.Content = article.Content;
                art.Tag = article.Tag;
                art.Template = article.Template;
                //pf has ID = '0816f19c-31c1-4103-8f51-ba422beab1c0' (first row in database)
                art.CreatedBy = pf;
                art.CreatedBy_ID = pf.ID;
                context.Articles.Add(art);
                context.SaveChanges();

                return article;
            }
            catch (Exception ex)
            {
                //But ex throw error duplicate ID = '7aa1d064-54ff-47b9-807d-db422fa71f8c' (second row in database)
                Debug.WriteLine(ex.StackTrace);

                throw ex;
            }

    }

DB Context:

public myContext()
    : base("name=abc")
{
    this.Configuration.LazyLoadingEnabled = true;
    this.Configuration.ProxyCreationEnabled = false;
}
public virtual DbSet<Category> Categories { get; set; }
public virtual DbSet<Role> Roles { get; set; }
public virtual DbSet<Template> Templates { get; set; }
public virtual DbSet<Article> Articles { get; set; }
public virtual DbSet<Picture> Pictures { get; set; }
public virtual DbSet<Profile> Profiles { get; set; }

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    //One-to-many: Article - Picture (nullable)
    modelBuilder.Entity<Picture>()
        .HasOptional<Article>(c => c.Article)
        .WithMany(p => p.Pictures)
        .HasForeignKey(f => f.ArticleId);

    ////One-to-many: Role - Profile
    modelBuilder.Entity<Profile>()
        .HasRequired<Role>(i => i.Role)
        .WithMany(i => i.Profiles)
        .HasForeignKey(f => f.RoleID);

    ///Many-to-many: Article - Category
    modelBuilder.Entity<Article>()
        .HasMany(t => t.Categories)
        .WithMany(t => t.Articles)
        .Map(m => {
                m.ToTable("ArticleCategories");
                m.MapLeftKey("ArticleId");
                m.MapRightKey("CategoryId");
         });
    //
        modelBuilder.Entity<Article>()
            .HasOptional(a => a.ApprovedBy)
            .WithMany(a => a.ArticleApprovedBy)
            .HasForeignKey(f=>f.ApprovedBy_ID)
            .WillCascadeOnDelete(false);

        modelBuilder.Entity<Article>()
            .HasRequired(a => a.CreatedBy)
            .WithMany(a => a.ArticleCreatedBy)
            .HasForeignKey(f => f.CreatedBy_ID)
            .WillCascadeOnDelete(false);

        base.OnModelCreating(modelBuilder);
}

I am using CodeFirst EF 6.1.3 and I am getting an error: Violation of PRIMARY KEY constraint 'PK_Profiles'. Cannot insert duplicate key in object 'dbo.Profiles' like this link Entity Framework Code First - Cannot insert duplicate key in object 'dbo.T_CRProviders'? Can anyone help me? Thanks.

1
0
5/23/2017 11:51:57 AM

Popular Answer

Your line:

 context.Profiles.Attach(pf);

will attach the pf, however it is already tracked by EF. You just got it from the database. The pf will be reinserted by EF, and this fails. Just remove the line and you will be fine.

Add/Attach and Entity States

0
10/29/2015 7:17:55 AM


Related Questions





Related

Licensed under: CC-BY-SA with attribution
Not affiliated with Stack Overflow
Licensed under: CC-BY-SA with attribution
Not affiliated with Stack Overflow