1

新しい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テーブルに追加するという事実が原因で状況が発生します。

その説明はありますか?

4

1 に答える 1

3

いくつかのこと。1つ、あなたはそれを間違っています:

新しいタグを追加する前にデータベース全体をチェックし、この関数を使用してタグが既に DB にあるかどうかを確認するため、これは発生しないはずです。

データベースはそのような制約をチェックできるので、コードではなくデータベースを使用してください。

第二に、あなたのコードは効率が悪いだけでなく (db を 2 回叩く)、バグもあります。データベースに対して名前を確認し、存在しないとしましょう。タグを追加し、同じ名前を確認しますが、まだ存在しないため、再度追加します。

それを保存すると、同じ名前の 2 つのレコードを保存したため、1 つのレコードを取得できません。

于 2011-10-03T05:44:23.117 に答える