C# 使用LINQPad将实体插入到具有标识列的SQL Compact 4表中

C# 使用LINQPad将实体插入到具有标识列的SQL Compact 4表中,c#,linq-to-sql,linqpad,identity-column,C#,Linq To Sql,Linqpad,Identity Column,我正在尝试使用LINQPad将新记录插入SQL CE 4数据库,但遇到了表的标识问题。比如说,我有一个简单的表: PEOPLE Id int IDENTITY(1,1) NOT NULL, Name nvarchar(100) NOT NULL 我可能做错了,但我在林帕德试过了 People person = new Person { Name = "Bob" }; People.InsertOnSubmit(person); SubmitChanges(); 但是我得到一个SqlCeExc

我正在尝试使用LINQPad将新记录插入SQL CE 4数据库,但遇到了表的标识问题。比如说,我有一个简单的表:

PEOPLE
Id int IDENTITY(1,1) NOT NULL,
Name nvarchar(100) NOT NULL
我可能做错了,但我在林帕德试过了

People person = new Person { Name = "Bob" };
People.InsertOnSubmit(person);
SubmitChanges();
但是我得到一个SqlCeException声明

"The colum cannot be modified. [ Column name = Id ]"
我可以用SQL插入一条记录,这很好,SQL CE或其数据提供程序没有错误,SQL CE为我设置Id列,这正是我想要的

INSERT INTO PEOPLE (Name) VALUES ('Bob');

还有我错过的一步吗?我甚至不确定这是否是一个LINQPad问题,但我想我还是要问一下,因为这就是我现在正在尝试这段代码的原因。

这可能是dbml文件的问题。检查列是否标记为identity(或L2S中的任何名称)。问题是,Id不能出现在insert查询中。

如果在LinqPad中运行此命令,会得到什么

(from dm in this.Mapping.GetTable(typeof(People)).RowType.DataMembers 
    select new  { dm.DbType, dm.Name, dm.IsPrimaryKey , dm.IsDbGenerated }
 ).Dump();
特别是,据我所知,id列的IsDbGenerated应该为true


我有一个以前在LinqPad中使用过的SQL CE 3.5数据文件,查看为插入生成的SQL,它没有提到id

我自己创建了表,并将其设置为如上所示的标识。如果您也看一下我为信息提供的内容,我没有设置ID。实体会自动将其设置为零(int的默认值),因为它不可为null。我说的是DBML,它是一个描述LinqToSQL中映射的xml文件。LinqToSql根据数据库中提供的映射生成对数据库的查询。在本例中,您没有意识到它,因为它是由LinqPad自动生成的。我确信LINQPad会生成各种临时文件以保持其灵活性,DBML似乎就是其中之一。我无法通过编辑临时文件来解决问题。事实证明,这并不是我做错了什么,这个错误在4.35测试版中得到了修复。所以我很高兴。谢谢你提供的关于DBML设置的信息,非常感谢。漂亮的指针!Id显示为主键,但IsDbGenerated为False。那么,这是我可以在SQL文件中更改的内容,还是需要在LINQPad中以编程方式设置的内容?当然,最好是修改文件,但我不确定是否可能。您不需要在LinqPad中执行任何操作。如果您让Linqpad自己构建datacontext,那么在没有数据库架构的情况下肯定有问题(可能id没有设置为标识/自动递增列)。如果您使用的是您自己预定义的datacontext,那么其中一定有错误(通常以dbml文件开始),我是否应该只创建标识为(1,1)的列以使其自动递增?这就是我到目前为止读到的。我不确定autoincrement是否是SQL CE的关键字。我使用的是LINQPad的datacontext,所以它必须是模式。我需要弄清楚,阿格。我刚想起一件事。我忘了提到我正在使用LinqPad版本4.34(从)的beta版,我只是在一个旧版本(2.31)上尝试了这一点,并且使用它IsDbGenerated是错误的。看起来这是一个已经修复的Linqpad错误。是的,这是我正在使用的当前版本(4.31)中的一个错误,beta 4.35.1有正确的修复。非常感谢!