2

タグ データベースに挿入する必要があるタグがいくつかあります。タグデータベースには、主キーでもある「タグ」列が 1 つしかありません。これは、挿入中に重複を防ぐためのトリックでした。

それでは、コードと問題です。

foreach (string tagval in tagarray)
{
    try
    {
        var tag = new Tag
        {
            Tag1 = tagval
        };
        db.AddToTags(tag);
    }
    catch
    {
    }
}
db.SaveChanges();

このアプローチの問題はSaveChanges()、重複が早期に見つかった場合に呼び出した後、プログラムが他のタグを保存せずに存在することです。テーブルに追加するたびに呼び出すとSaveChanges()、プログラムが非効率になり、多くの呼び出しを行う必要があります。以前の挿入が失敗した後でも挿入を続行するにはどうすればよいですか?

代替ソリューションも歓迎されます。

4

3 に答える 3

1

Entity Framework とObjectContext派生物を使用すると、次のようなことができます。

foreach (var newTag in tagarray.Select(t => 
               new Tag { Tag1 = t }).Except(db.Tags))
{
    db.Tags.AddObject(newTag);
}

try
{
    db.SaveChanges(SaveOptions.AcceptAllChangesAfterSave);
}
catch (OptimisitcConcurrencyException)
{
    db.Refresh(RefreshMode.StoreWins, db.Tags);
    foreach (var newTag in tagarray.Select(t => 
                   new Tag { Tag1 = t }).Except(db.Tags))
    {
        db.Tags.AddObject(newTag);
    }
    db.SaveChanges();
}
于 2012-09-06T07:34:36.980 に答える
1

ここでいくつか変更する必要があります。まず、データベースの近くに移動する前に.Distinct、リストを呼び出して挿入することにより、独自のリストから重複を削除することをお勧めします。

また、ここでは try catch は必要ありません。挿入を行う前に、データベースに既に何があるかを確認する必要があります。これを試して:

List<string> uniqueItems = tagarray
    .Distinct()
    .Where(x => !db.Tags.Contains(x))
    .ToList();

foreach (string uniqueItem in uniqueItems)
{
    var tag = new Tag
    {
        Tag1 = tagval
    };
    db.AddToTags(tag);   
}

db.SaveChanges();
于 2012-09-06T07:38:10.290 に答える