C# 具有自动生成ID的表的SqlCe、EF5、IDENTITY\U INSERT

C# 具有自动生成ID的表的SqlCe、EF5、IDENTITY\U INSERT,c#,.net,sql,entity-framework,sql-server-ce,C#,.net,Sql,Entity Framework,Sql Server Ce,所以我需要将数据从现有数据库SqLite移动到新的SqlCe数据库。我用NHibernate加载实体,因为这是我用于SqLite数据库的DAL。新数据库(SqlCe)是使用EF Code First/DbContext创建的 现在,我只想为每个表创建一个一次性使用方法,以“手动”插入实体及其现有ID(因为我想保留ID)。这些表使用自动生成的ID,所以我需要覆盖它。问题是,最简单的方法是什么?可以用DbContext完成吗 最好是强类型的,但到目前为止,我尝试使用SqlCeConnection.C

所以我需要将数据从现有数据库SqLite移动到新的SqlCe数据库。我用NHibernate加载实体,因为这是我用于SqLite数据库的DAL。新数据库(SqlCe)是使用EF Code First/DbContext创建的

现在,我只想为每个表创建一个一次性使用方法,以“手动”插入实体及其现有ID(因为我想保留ID)。这些表使用自动生成的ID,所以我需要覆盖它。问题是,最简单的方法是什么?可以用DbContext完成吗

最好是强类型的,但到目前为止,我尝试使用SqlCeConnection.CreateCommand/.ExecuteNonQuery和硬类型的SQL。但不确定这里的语法,因为我不太懂SQL

对于下面的代码,指定变量键的各种尝试会产生以下异常:

@0=>Message=缺少一个参数。[参数序号=8]

“{0}”=>Message=数据转换失败。[OLE DB状态值(如果已知)=2]

{0}=>Message=数据转换失败。[OLE DB状态值(如果已知)=2]


永远不要为查询设置字符串格式。始终使用参数化查询

在您的特定情况下,最可能的问题是您传递了一个datetime(CreationDate),但没有这样引用它:“{0}”

        var conn = new SqlCeConnection("Data Source=" + DbFileName);
        conn.Open();
        var cmd = conn.CreateCommand();
        cmd.CommandText = @"SET IDENTITY_INSERT AccountBases ON;";
        cmd.ExecuteNonQuery();

            cmd.CommandText = string.Format(
               @"INSERT INTO AccountBases (
                AccStartTime, AccType, Broker, 
                ClientID, ConnType, CreationDate, 
                Guid, Id, Name, 
                Strategy)  
               VALUES({0}, {1}, {2}, {3}, {4}, {5}, {6}, {7}, {8}, {9} );",
               a.AccStartTime, 
               a.AccType, 
               a.Broker, 
               a.ClientID, 
               a.ConnType, 
               a.CreationDate, 
               a.Guid, 
               a.Id, 
               a.Name, 
               a.Strategy);
            cmd.ExecuteNonQuery();

        conn.Close();