嗨,我有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()
。
结果如下:
编辑:我试图只获得新项目但失败了。
List<Contenu> contenuAjoute = contenus.Except(editableSacoche.Contenus.ToList()).ToList();
在contenuAjoute
中即使它们相等,我也能得到所有记录......
答案 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();
如果这是正确的方法,我现在不行,但它运作正常。