调用SaveChanges()时数据库中的重复记录

时间:2013-09-04 15:14:41

标签: c# .net sql entity-framework

嗨,我有EF的问题。在我的应用程序中,我必须从数据库加载一些内容以填充DataGrid

UserControl:

 contenus = new List<Contenu>();
        contenus = sacoche.Contenus.ToList(); // i get sacoche in the parameter of the contructor
        ContenuViewSource.Source = contenus;
        ContenuView = (ListCollectionView)ContenuViewSource.View;
        ContenuView.Refresh();

一切正常,但当我尝试添加其他一些Contenus时,我在数据库中获得了重复记录。重复记录之间的唯一区别是第一条记录松开了他的外键。

我将Contenu添加到Sacoche

editableSacoche = SacocheDal.dbContext.Sacoches.Include("Contenus").First(i => i.SacocheID == editableSacoche.SacocheID);
            editableSacoche.Contenus = contenus;
            SacocheDal.dbContext.SaveChanges();

我所做的就是获取Sacoche并添加Contenu,最后致电SaveChanges()

结果如下:     problem duplicate

编辑:我试图只获得新项目但失败了。

List<Contenu> contenuAjoute = contenus.Except(editableSacoche.Contenus.ToList()).ToList();

contenuAjoute中即使它们相等,我也能得到所有记录......

2 个答案:

答案 0 :(得分:1)

试试这个:

editableSacoche = SacocheDal.dbContext.Sacoches.Include("Contenus").First(i => i.SacocheID == editableSacoche.SacocheID);
editableSacoche.Contenus = null;
            editableSacoche.ContenusID = contenus.ID;
            SacocheDal.dbContext.SaveChanges();

答案 1 :(得分:0)

我找到了实现我想要的方法。我创建了ItemComparer并使用Except仅添加新项目。

这是比较器:

 class ContenuComparer : IEqualityComparer<Contenu>
{
    public bool Equals(Contenu x, Contenu y)
    {
        if (x.ContenuID == y.ContenuID)
            return true;

        return false;
    }

    public int GetHashCode(Contenu obj)
    {
        return obj.ContenuID.GetHashCode();
    }
}

这里代码:

editableSacoche = SacocheDal.dbContext.Sacoches.Include("Contenus").First(i => i.SacocheID == editableSacoche.SacocheID);
            List<Contenu> contenuAjoute = contenus.Except(editableSacoche.Contenus.ToList(), new ContenuComparer()).ToList();
            foreach (Contenu c in contenuAjoute)
            {
                editableSacoche.Contenus.Add(c);
            }
            SacocheDal.dbContext.SaveChanges();

如果这是正确的方法,我现在不行,但它运作正常。