更新SqlCE数据库Linq-to-Sql

时间:2011-01-11 14:10:26

标签: sql sql-server database linq-to-sql sql-server-ce

当我更新数据库时,我必须对每个属性进行硬编码映射,因为使用附加结果会导致异常。这似乎并不太优雅。这里有一些比较简单的解决方案我不知道吗?我的代码如下,显示了我为此目的调用的“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

EDIT1:

例外:

ctx.Users.Attach(user,q)

无法使用已在使用的密钥添加实体。

ctx.Users.Attach(user,True)

如果实体声明版本成员或没有更新检查策略,则只能在没有原始状态的情况下附加为已修改的实体。


EDIT2:

我尝试添加一个列时间戳,我相信它应该满足最后提到的异常。所以我添加了这里显示的列。这没有用,但也许我需要进一步设置才能有效?

1 个答案:

答案 0 :(得分: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();
                }
            }
        }
    }