Как добавить в список с Linq to SQL?

У меня есть таблица в базе данных, которую я извлекаю с помощью LINQ to SQL, и как часть своей обработки я хочу добавить в этот список, а затем обновить базу данных новыми элементами + любые изменения, которые я внес.

Я думал, что смогу сделать следующее:

var list = (from item in db.Table
            select item).ToList();

[do processing where I modify items & add to the list]

list = list.Distinct();

db.SubmitChanges();

Что происходит, так это то, что изменения произошли (т.е. обновления SQL), но любые новые элементы, которые я добавляю в список, не добавляются.

Очевидно, я делаю это неправильно, как правильно изменить и добавить в список объектов БД, а затем зафиксировать все обновления и вставки?

4 ответа

Решение

Список не имеет смысла. Просто случается, что он содержит объекты, о которых знает DataContext. Нам нужно убедиться, что DataContext знает о новых. Важно то, что они не должны быть полными, когда мы сообщаем им DataContext:

Item item;
if (needNewOne)
{
     item = new Item();
     db.InsertOnSubmit(item);
}
else
{
     item = list[i];
}
///  build new or modify existing item
///   :
db.SubmitChanges();

Вы можете создать метод расширения для него:

static void EnsureInsertedOnSubmit<TEntity>( this Table<TEntity>  table
                                            ,IEnumerable<TEntity> entities)
 { foreach(var entity in entities) 
    { if  (   table.GetModifiedMembers(entity).Length == 0     
           && table.GetOriginalEntityState(entity) == default(TEntity))
       { table.InsertOnSubmit(entity);
       }
    }
 }

И тогда вы можете сделать это:

 var list = db.Table1.ToList();
 list.Add(new Item());
 db.Table1.EnsureInsertedOnSubmit(list);
 db.SubmitChanges();

Вы должны указать LINQ вставить новую строку при отправке, используя InsertOnSubmit:

db.InsertOnSubmit(newrow);
db.SubmitChanges();

Вам не нужен новый DataContext, вы можете использовать тот, который вы используете для обновлений.

То же самое для удаления DeleteOnSubmit(строка). Изменения будут отслеживаться, хотя.

Вы должны добавить новые элементы через InsertOnSubmit.

Другие вопросы по тегам