2010-08-18 2 views
0

Очень простое обновление. Он просто терпит неудачу, без ошибок, никаких изменений в базе данных не происходит.Обновление базы данных Linq-to-SQL

Dim db As New BarClassesDataContext 
Dim foo = (From a In db.articles Where a.id = 14 Select a).Single 
Response.Write("<h3>" & foo.title & "</h3>") 
foo.title = "This is my new, updated title for article ID #14" 
db.SubmitChanges() 

Вот уместная часть моего класса статей. Кроме того, это веб-форма, поэтому у меня нет консоли. Есть ли другой способ просмотра вывода T-SQL?

<Table(Name:="dbo.article")> _ 
Partial Public Class article 

    Private _id As Integer 
    Private _issueid As Integer 
    Private _dateadded As Date 
    Private _title As String 
    Private _titlelink As String 
    Private _description As String 
    Private _image As String 
    Private _imagelink As String 
    Private _type As Integer 

    Public Sub New() 
     MyBase.New 
    End Sub 

    <Column(Storage:="_id", AutoSync:=AutoSync.Always, DbType:="Int NOT NULL IDENTITY", IsDbGenerated:=true)> _ 
    Public Property id() As Integer 
     Get 
      Return Me._id 
     End Get 
     Set 
      If ((Me._id = value) _ 
         = false) Then 
       Me._id = value 
      End If 
     End Set 
    End Property 
+0

Уверены, что есть идентификатор t шляпа равна 14? –

+0

Да, есть и id, равный 14. – mmcglynn

ответ

0

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

Dim foo = (From a In db.articles Where a.id == 14 Select a).Single 

Основная проблема, которую я вижу, это отсутствие UpdatetOnSubmit() заявление. Как L2S знает, что вы хотите сделать обновление?

Попробуйте

db.Articles.UpdateOnSubmit(foo); 
db.SubmitChanges(); 

или что-то близко к этому.

+0

В VB.NET нет такой вещи, как '=='. Это разумно знает, когда использовать '=' для присваивания vs '=' для сравнений равенства. C# знает, как это сделать, но он просто дает вам ошибку компилятора при неправильном использовании. – mattmc3

+0

Также нет такой вещи, как 'UpdateOnSubmit()'. Там 'InsertOnSubmit()', но это только для новых записей. DataContext отслеживает, какие объекты он вам дал, и обновит их только с помощью вызова SubmitChanges(). C'mon ... Код C# для вопроса VB и методы создания - у вас очень хороший показатель репутации, поэтому я должен предположить, что вы действительно знаете лучше этого. – mattmc3

0

Мое подозрение, что у вас нет правильно определенного первичного ключа в вашей базе данных и/или в ваших атрибутах System.Data.Linq.Mapping. Покажите нам класс Article - это, вероятно, будет, где ваша проблема. Убедитесь, что у вас есть поле IDENTITY в вашей базе данных, и убедитесь, что ваш linqed-класс имеет IsPrimaryKey: = True и IsDbGenerated: = True в атрибуте <Column>.

Также было бы целесообразно установить свойство .Log в вашем DataContext, чтобы увидеть, что SQL выполняется. Мне нравится метод логгера окна отладки, о котором я упомянул здесь: DataContext SubmitChanges in LINQ

1

Если у вас есть недопустимые определения полей, у вас может возникнуть проблема, в которой 0 = 1 добавляется в пункт WHERE. Убедитесь, что установлены все поля, не содержащие значения NULL. (Я боролся с этим в течение около двух часов на одну ночь во время просмотра SQL Profiler добавить дополнительный 0 = 1 для нет оснований.)

(Если я могу найти вопрос на connect.microsoft.com, я также опубликую его)

+0

Хорошая мысль! Как я уже упоминал в своем ответе, установка свойства '.Log' даст вам исполняемый SQL, поэтому вы должны сразу увидеть, есть ли у вас что-то напуганное, вместо угадывания/отладки. – mattmc3

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