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 を追加しようとすると、データベースに重複したレコードが作成されます。複製されたレコードの唯一の違いは、最初のレコードが外部キーを失っていることです。

ここで、 myContenuに my を追加し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 に答える