2013-10-08 4 views
1

У меня вопрос с новичком.Обновление одной строки в linq

Я бы попытался обновить одну строку таблицы, в частности, используя значение первичного ключа, используя linq.

var mytab = new Customer(); 
mytab.FirstName = mymodel.FirstName; 
mytab.LastName = mymodel.LastName; 
mytab.CustomerId = mymodel.CustomerId; 

db.AddToCustomer(mytab); 
db.SaveChanges() 

Это просто добавляет новую строку с новым идентификатором. Выполнение кода показывает, что «mymodel» передает правильные значения с первым или последним именем, которое я хочу обновить.

Mymodel.CustomerId - это правильный идентификатор записи, которую я хочу обновить, но SQL Profiler показывает, что я ничего не обновляю. Нужно ли использовать. Сначала?

+2

LINQ ISN» t для обновления, как в 'Q' = Query! Что вы используете в качестве своего бэкэнда? Linq2SQL? LINQ2Entities? – Arran

ответ

6

Ваш код создает новую строку. Для обновления вам необходимо сначала выбрать свой клиент по идентификатору из базы данных, а затем обновить:

var mytab = db.Customers.First(g=>g.CustomerId == mymodel.CustomerId); 
mytab.FirstName = mymodel.FirstName; 
mytab.LastName = mymodel.LastName; 
db.SaveChanges() 
+0

Вы должны просто использовать 'First', если ваша следующая строка генерирует исключение нулевой ссылки, когда бит OrDefault происходит. –

+0

@PrestonGuillot Согласен –

+0

Интересный выбор 'g' в лямбда. Обычно я использую 'x', и многие люди используют первую букву типа сущности, в этом случае' c' для 'Customer'. Не то, чтобы это повлияло на правильность кода. – xdumaine

0

Попробуйте это:

db.Customer.First(x=> x.CustomerId == mymodel.CustomerId).FirstName = mymodel.FirstName; 
db.Customer.First(x=> x.CustomerId == mymodel.CustomerId).LastName = mymodel.LastName; 
db.SaveChanges(); 

Или: (! Я предпочитаю это)

db.Entry(mymodel).State = EntityState.Modified; 
db.SaveChanges(); 
Смежные вопросы