0

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

用户控制:

 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()

这是结果: 问题重复

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

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

contenuAjoute我得到所有的记录,即使它们是相等的......

4

2 回答 2

1

尝试这个:

editableSacoche = SacocheDal.dbContext.Sacoches.Include("Contenus").First(i => i.SacocheID == editableSacoche.SacocheID);
editableSacoche.Contenus = null;
            editableSacoche.ContenusID = contenus.ID;
            SacocheDal.dbContext.SaveChanges();
于 2013-09-04T19:22:03.003 回答
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();

如果它是正确的方法,我现在不知道,但它工作正常。

于 2013-09-05T08:28:16.050 回答