なぜこれが複数を挿入しようとしているのですか?

c# entity-framework
なぜこれが複数を挿入しようとしているのですか?

以下の方法があります

public static Artist ProcessArtist(Artist artist, Entities db) {
    var artistLookup = db.Artist.SingleOrDefault(x => x.ExternalId == artist.ExternalId);
    if (artistLookup == null) {
        artistLookup = new Artist {
            ExternalId = artist.ExternalId,
            Name = artist.Name
        };
        db.Artist.AddObject(artistLookup);
        db.SaveChanges();
    }
    return artistLookup;
}

私が使用している方法は、「ExternalId」と「Name」が設定された「Artist」オブジェクトを渡しますが、エンティティコンテキストにはまったく接続されていないということです。 外部ソースから取得されました。

`db.SaveChanges()`を呼び出すと、 `ExternalId`の一意のキー制約が破られたことを示してスローされます。 倍数を挿入する方法がわかりません。

誰かが何か洞察を持っていますか? ありがとうございます。

編集:呼び出しコードを以下に追加しました

var albums = from item in externalSource
             select new Album {
                 Country = country // Another entity, one that exists in the database
                 Name = item["Name"].Value,
                 Artist = new Artist {
                     ExternalId = Int32.Parse(item["ArtistId"].Value),
                     Name = item["ArtistName"].Value
                 }
             };

アルバムごとに「ProcessArtist」を呼び出します

foreach (var album in albums) {
    album.Artist = ProcessArtist(album.Artist, db);
    db.Album.AddObject(album);
}

  3  0


ベストアンサー

var artistLookup = db.Artist.SingleOrDefault(x => x.ExternalId == artist.ExternalId);
//in this line  you get an artist from the database


//i dont know why would you want to insert the artist that you just get from the database
//you are reinserting an existing record. That's the reason you get the error
    db.Artist.AddObject(artistLookup);
    db.SaveChanges();

0


forループを見ると、エラーはArtistエンティティによるものではないと思いますが、forループのすべてのステップとは異なるエンティティである可能性があります。Artistを追加した後はコンテキストを保存していますが、追加されたアルバムと保留中のアルバムのキー違反がある可能性があります。

わかりました。アーティストを割り当てるとき、IDなしで存在する他のアルバムがまだあり、オブジェクトコンテキストに何かを追加または添付すると、オブジェクトグラフ全体が添付されます。 ここで問題は、以前に作成したオブジェクトを再利用していることです。

rssからオブジェクトを作成するコードでは、エンティティを使用せず、代わりにプロキシクラスを使用します。 たとえば、RAlbumとRArtistをforループで変更します。

var albums = externalSourceのアイテムから。新しいRAlbum \ {国を選択
= country //別のエンティティ、データベースに存在するエンティティ
Name = item [“Name”]。Value、Artist = new RArtist \ {ternalExternalId = Int32.Parse(item [“ArtistId”]。Value)、item item item item “item” “” item item item item item item item item item item item item item item item item item ternal ternal ternal

public static Artist ProcessArtist(RArtist artist, Entities db) {
    var artistLookup = db.Artist.SingleOrDefault(x => x.ExternalId == artist.ExternalId);
    if (artistLookup == null) {
        artistLookup = new Artist {
            ExternalId = artist.ExternalId,
            Name = artist.Name
        };
        db.Artist.AddObject(artistLookup);
        db.SaveChanges();
    }
    return artistLookup;
}


foreach (var album in albums) {
    Album a = new Album();
    // copy properties of a from album
    a.Artist = ProcessArtist(album.Artist, db);
    db.Album.AddObject(a);
}

0


タイトルとURLをコピーしました