2011-01-11 2 views
0

Когда я обновляю базу данных, мне приходится жестко кодировать отображение каждого свойства, потому что использование attach приводит к исключению. Это не слишком элегантно. Есть ли более легкое решение, о котором я не знаю? Мой код ниже, показывая метод «MapData», который я вызываю для этой цели:Обновление базы данных SqlCE Linq-to-Sql

Btw, классы сущностей (здесь, пользователи) автогенерируются с помощью SqlMetal.

Public Class UserDataService 

    Public Sub Save(ByVal user As Users) 
     Dim ctx As New TestDB(connection) 
     Dim id As Integer = user.Id 

     If user.Id = 0 Then 
      Insert(user) 
     Else 
      Dim q = (From n In ctx.Users Where n.Id = id Select n).Single 
      q.MapData(user) 
      For Each o In user.Orders 
       o.Save() 
      Next 

      ' ctx.Users.Attach(user, q)    ' Does not work 
      ' ctx.Users.Attach(user, True)   ' Does not work 

     End If 

     ctx.SubmitChanges() 
     ctx.Dispose() 
    End Sub 

End Class 

Partial Public Class Users 

    Public Sub MapData(ByVal row As Users) 
     Me.Name = row.Name 
    End Sub 

End Class 

edit1:

Исключения:

ctx.Users.Attach (пользователь, д)

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

ctx.Users.Attach (пользователь, True)

Субъект может быть присоединен только модифицировано без первоначального состояния, если он заявляет член версии или не имеет проверки обновлений политики.


EDIT2:

Я пытался добавить столбец временную метку, которую я считаю, должен удовлетворять последний Упоминается исключение. Поэтому я добавляю колонку, показанную здесь. Это не помогает, но, возможно, мне нужно сделать некоторые дополнительные настройки, чтобы это было эффективным?

+0

Что исключение вы получаете? – SLaks

+0

Я отредактировал эту информацию. – bretddog

ответ

0

Этот способ должен работать:

ctx.Users.Attach(user) 
ctx.Refresh(RefreshMode.KeepCurrentValues, user)  'this line is important 
ctx.SubmitChanges() 

Это моя консоль тест приложение (он работает), в C#, хотя:

class Program 
    { 
     public static void Main(string[] args) 
     { 
      var t = new Test(); 

      Customer c = t.GetCustomer(); 
      c.CompanyName = "X"; 
      t.AttachCustomer(c); 
     } 


     class Test 
     { 
      public Customer GetCustomer() 
      { 
       Customer cust; 
       using(DataContext db = new DataContext()) 
       { 
        cust = db.Customers.Where(x => x.CustomerID == "ALFKI").Single(); 
        db.Dispose(); 
       } 
       return cust; 
      } 


      public void AttachCustomer(Customer cx) 
      { 
       using (DataContext db = new DataContext()) 
       { 
        db.Customers.Attach(cx); 
        db.Refresh(RefreshMode.KeepCurrentValues, cx); 
        db.SubmitChanges(); 
        db.Dispose(); 
       } 
      } 
     } 
    } 
Смежные вопросы