2010-05-23 2 views
2

Я застрял с этими проблемами в течение длительного времени.LINQ to Sql: Вставить вместо обновления

Все, что я пытаюсь сделать, это вставить строку в мою БД, если это новая информация - если не обновить существующий.

Я обновил многие объекты в моей жизни раньше, - но то, что случилось с этим кодом, вне меня (возможно, что-то довольно простой) Я предполагаю, что я не могу видеть лес за деревьями ...

private Models.databaseDataContext db = new Models.databaseDataContext(); 

internal void StoreInformations(IEnumerable<EntityType> iEnumerable) 
{ 
foreach (EntityType item in iEnumerable) 
{ 
    EntityType type = db.EntityType.Where(t => t.Room == item.Room).FirstOrDefault(); 
    if (type == null) 
    { 
    db.EntityType.InsertOnSubmit(item); 
    } 
    else 
    { 
    type.Date = item.Date; 
    type.LastUpdate = DateTime.Now(); 
    type.End = item.End; 
    }  
} 
} 

internal void Save() 
{ 
db.SubmitChanges(); 
} 

Редактировать: только что проверил ChangeSet, обновления не только вставляются. Сейчас я поселилась с

foreach (EntityType item in iEnumerable) 
{ 
    EntityType type = db.EntityType.Where(t => t.Room == item.Room).FirstOrDefault(); 
    if (type != null) 
    { 
     db.Exams.DeleteOnSubmit(type); 
    } 
    db.EntityType.InsertOnSubmit(item); 
} 

, но я хотел бы сделать обновления и потерять эти ненужные ВЕЬЕТЕ.

+0

Что такое 'cur'? Он не определен в коде, который вы подключили. –

+0

Можете ли вы рассказать нам, что произошло, когда вы запустили этот код и что вы хотели вместо этого? –

+0

вставляет новую строку - независимо от типа == null или нет и. Каждая строка должна ссылаться на другую комнату. Я пишу веб-сайт asp.net mvc, который отображает класс (в школе), который имеет место в любой комнате. Один класс может быть только в одной комнате. Если, например, инструктор меняется, мне нужно обновить объект, которого нет. В конце концов, у меня есть старая запись, а новая - с введенной правильной информацией. –

ответ

0

Ну, я выяснил, почему это не сработало так, как я его ожидал.

function Stuff() 
{  
    Wrapper x = new Wrapper(); 
    Type a = new Type(); 
    InsertType(a); 
    x.Type = a; 
    InsertOnSubmit(x); 
} 

function InsertType (Type a) 
{ 
    InsertOnSubmit(a); 
} 

, так как a в x все тот же a будет вставлен второй раз - это все еще новый. Каким-то образом я думал, что они ссылаются и, по сути, одинаковы.

Я не думал о том, почему он работает, когда я сначала удаляю старую запись. Не хочу тратить на это больше времени. На новые миры (EF4 или NHibernate)!

0

Не хотите ли вы item.Room вместо iEnumerable.Room?

+0

true, и я отредактировал вопрос соответственно, так как он не решает основной проблемы. –

0

Интересно, если у вас возникли проблемы из-за проблемы, обсуждаемые здесь: Why can't I change elements from a linq IEnumerable in a for loop?

Один из способов проверить, что будет проходить в Список EntityType вместо IEnumerable как таковой:

internal void StoreInformations(IList<EntityType> iEnumerable) 
{ 
... 
} 
+0

Просто попробовал, к сожалению, ничего не меняет (поскольку я не обновляю iEnumerable). Я тоже проверял все, еще не повезло –

+0

Думаю, возможно, я отклонил ваш ответ слишком рано. Поскольку ничего нового не было, я видел только три вставки. Но я попытался заставить обновление - я получаю для каждой вставки обновление - поэтому исходное значение будет обновляться, а новое вставлено ... –

+0

Итак, вы достигли какого-либо прогресса или собираетесь придерживаться обходного решения, которое вы разместили выше ? В моем ответе я думал, что в разделе, которое вы делали обновление, 'item' уничтожается после цикла foreach, и, возможно, именно поэтому' type' не обновлялся. Недавно я был укушен проблемами при попытке сделать обновления во время работы с IEnumerable <>, и я решил проблему, используя IList <> в определенных местах. Я новичок в Linq, но ваша проблема выглядела несколько схожей, поэтому я подумал, что возможно использование IList вместо IEnumerable может работать. Но я не знаю достаточно, чтобы сказать, почему. –