Почему я не могу обновить данные в базе данных, используя LINQ to SQL? - PullRequest
6 голосов
/ 16 сентября 2010

Я пытаюсь обновить данные, пока я читаю их из базы данных, см. Ниже. Но после того, как все закончилось, данные не обновлялись.

Какой синтаксис транзакции мне нужно указать? (Когда я отлаживаю, я вижу, что получена правильная запись.)

using (conn = new SqlConnection(MyConnectionString))
                using (SqlCommand cmd = new SqlCommand("dbo.MyProcedure", conn))
                {
                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.Parameters.AddWithValue("@Count", count);
                    conn.Open();
                    using (SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection))
                    {
                        while (reader.Read())
                        {
                            // wrapper object, not related to database
                            SampleModel c = new SampleModel();  
                            c.ID= (string)reader["ID"];
                            c.Name = (string)reader["Name"];
                            c.Type = (int)reader["Type"];

                            // modeList will return to outside, not related to database
                            modelList.Add(c);

                            sampleTable1  table1 = context.sampleTable1s.SingleOrDefault(t=> t.id = c.ID);   

                            // try to update the "isRead", but it doesn`t work....!!!
                            // about the datatype, in the data base, it is "smallInt"
                            // in linq to sql, it is "short?"
                            // PS Default value all should be 0
                            table1.isRead = 1;
                            context.SubmitChanges();  <--- here, it doesn`t do the job // context is new from Linq to SQL
                        }
                    }
                    conn.Close();
                }

Вот моя процедура:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE MyProcedure    
    @Count int = 100
AS
BEGIN

  SELECT TOP (@Count )
         t1.id AS ID, 
         t1.name AS Name, 
         t2.type AS TYPE    
    FROM sampleTable1 as t1 with (nolock), 
         sampleTable2 as t2 with (nolock)          
   WHERE (t1.t2Id = t2.Id)     
ORDER BY t1.name asc

END
GO

И если я положу весь свой код в блок TransactionScope

using (TransactionScope scope = new TransactionScope())
{
    // all the C# code above
    scope.Complete();
}

Я получу исключение "MSDTC на сервере 'localhost-sqlserver2005' недоступен."

И если я добавлю только часть кода, то нет исключения, но данные не обновляются

using (TransactionScope scope = new TransactionScope())
{
    sampleTable1  table1 = context.sampleTable1s.SingleOrDefault(t=> t.id = c.ID);   

    table1.isRead = 1;
    context.SubmitChanges(); 

    scope.Complete();
}

Спасибо.

Ответы [ 2 ]

8 голосов
/ 16 сентября 2010

Убедитесь, что по крайней мере один элемент в рассматриваемом классе сущности помечен как элемент первичного ключа в конструкторе L2S.Если у сущности нет членов PK, L2S будет молча игнорировать ее при отправке обновлений (молча, как без исключений и без оператора SQL обновления, сгенерированного и отправленного в db).

2 голосов
/ 16 сентября 2010

Убедитесь, что у вас установлен первичный ключ для этой таблицы.Если вы не можете сделать это в БД, сделайте это в конструкторе linq2sql.

Ответили на это здесь , здесь и здесь .Также упомянул это linq к sql подводные камни .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...