新しいEntityFramework4.1を使用すると問題が発生します。数日前にテストを開始しましたが、POCOの概念全体とこの新しいAPIにはまだ慣れていません。
とにかく、いくつかのコーディングをしている間、私は次のようなものを作成しました:
public Tag GetTagWithName(string name)
{
if (db.Tags.SingleOrDefault(q => q.Name == name) == null)
{
return new Tag { Name = name };
}
else
{
return db.Tags.SingleOrDefault(q => q.Name == name);
}
}
これは、このような名前のタグがすでに存在するかどうかをデータベースでチェックすることになっています。私はこのコードでこの関数を使用しています。
if (tags != null)
{
foreach (HtmlNode tagNode in tags)
{
string tagString = tagNode.InnerText.Remove(0, 1);
Tag tag = TagRep.GetTagWithName(tagString);
pic.Tags.Add(tag);
}
}
if (context.Pictures.Any(q => q.Link == pic.Link))
{
continue;
}
else
{
context.Pictures.Add(pic);
}
context.SaveChanges();
これは基本的に、新しく作成された写真にタグを追加し、写真がすでにデータベースにあるかどうかを確認し、データベースに追加していない場合は、すべての写真の後にSaveChanges()を呼び出します。
私の問題は、実行中に関数GetTagWithNameが「SingleOrDefault」の取得時に「シーケンスに複数の要素が含まれています」というエラーを引き起こすことです。これは、新しいタグを追加する前にデータベース全体をチェックし、この関数を使用してチェックするためです。タグがすでにDBにある場合。
私のコードで見たところ、データベースから取得したTagオブジェクトをPictureに追加しても、後でそれを新しいオブジェクトとしてTagsテーブルに追加するという事実が原因で状況が発生します。
その説明はありますか?