Обновить базу данных SqlCE Linq-to-Sql - PullRequest
0 голосов
/ 11 января 2011

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

Кстати, классы сущностей (здесь; Пользователи) автоматически генерируются с помощью 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

РЕДАКТИРОВАТЬ1:

Исключения:

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

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

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

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


EDIT2:

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

1 Ответ

0 голосов
/ 04 февраля 2011

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

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();
                }
            }
        }
    }
...