2008-10-29 2 views
2
// goal: update Address record identified by "id", with new data in "colVal" 

string cstr = ConnectionApi.GetSqlConnectionString("SwDb"); // get connection str 
using (DataContext db = new DataContext(cstr)) { 
    Address addr = (from a in db.GetTable<Address>() 
        where a.Id == id 
        select a).Single<Address>(); 
    addr.AddressLine1 = colValue.Trim(); 
    db.SubmitChanges(); // this seems to have no effect!!! 
} 

В отладчике, адр имеет все текущие значения из таблицы БД, и я могу подтвердить, что addressLine1 изменяется только перед тем, как позвонить db.SubmitChanges() ... SQL Profiler показывает только «Сбросить соединение», когда выполняется строка SubmitChanges. Кто-нибудь понял, почему это не работает? БЛАГОДАРЯ!LinqToSql Не Обновление базы данных

ответ

6

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

Также убедитесь, что в вашей таблице указан первичный ключ и что сопоставление знает об этом первичном ключе. В противном случае вы не сможете выполнять обновления.

+0

Я понятия не имел, что в таблице нужен первичный ключ. Я довольно долго бил головой о стену, пытаясь понять, почему смена изменений не работает. Спасибо за этот ответ! – 2009-08-07 03:07:56

1

Смешно, использовать GetTable и Single. Я бы ожидал, что код будет выглядеть так:

string cstr = ConnectionApi.GetSqlConnectionString("SwDb"); // get connection str 
using (DataContext db = new DataContext(cstr)) 
{  
    Address addr = (from a in db.Address where a.Id == id select a).Single();  
    addr.AddressLine1 = colValue.Trim();  
    db.SubmitChanges(); // this seems to have no effect!!! 
} 

Я понятия не имел, что GetTable сделает с вами.

Другое дело, для отладки Linq2SQL попробуйте добавить

db.Log = Console.Out; 

перед тем SubmitChanges(), это покажет Вам выполняется SQL.

+0

db.GetTable

() - это то же самое, что и db.Address. Последнее является просто дополнительным свойством, которое вызывает db.GetTable <>. – liggett78 2008-10-29 22:30:50

1

Спасибо - ваши комментарии помогут мне разобраться в этом, я уверен! У меня не было столбца «Id», определяемого как PrimaryKey, так что это очевидный не-стартер. Я бы ожидал, что LinqToSQL сбросил бы ошибку, когда обновление завершится неудачно. - S.

1

Хорошо, вот результат. Я не могу использовать форму db.Address, потому что я не использовал дизайнер для создания своих объектов базы данных, вместо этого я определил их как классы, как это:

[Table(Name = "Addresses")] 
public class Address 
{ 
    [Column(Name = "Id",IsPrimaryKey=true)] 
    public int Id { get; set; } 
    [Column(Name = "AddressLine1")] 
    public string AddressLine1 { get; set; } 
     ... 

Первоначально, я не имел " Id ", установленном как PK в базе данных, и я не идентифицировал его с использованием IsPrimaryKey = true в спецификаторе [Column ...] выше. Оба необходимы! Как только я сделал это изменение, ChangeSet нашел обновление, которое я хотел сделать, и сделал это, но до этого он сказал мне, что 0 строк необходимо обновить и отказано в фиксации изменений.

Благодарим за помощь! - S.

+0

Итак, ответ заключался в том, что вам нужен первичный ключ. :) – Bryant 2011-09-14 22:17:09

Смежные вопросы