Vb.net 实体框架SaveChanges-如何在插入时忽略ID/Identity字段
VB.NET4 WinForms应用程序 我有一个(DevExpress)网格绑定到(MyClass的)IEnumerable。 每当添加新行时,ID默认为零(0)。在尝试保存更改时,EntityFramework没有意识到作为标识字段意味着它应该忽略insert上的任何内容,而只插入其他值。我不能指定null/Nothing,因为它只是将ID保持为零 我可以手动添加和保存MyClass的实例,但我正在尝试让它在网格处理添加/初始化/etc新条目的地方工作。据我所知,问题不在于网格,而在于实体框架以及生成的SQL和实体类Vb.net 实体框架SaveChanges-如何在插入时忽略ID/Identity字段,vb.net,entity-framework,linq-to-entities,identity,xtragrid,Vb.net,Entity Framework,Linq To Entities,Identity,Xtragrid,VB.NET4 WinForms应用程序 我有一个(DevExpress)网格绑定到(MyClass的)IEnumerable。 每当添加新行时,ID默认为零(0)。在尝试保存更改时,EntityFramework没有意识到作为标识字段意味着它应该忽略insert上的任何内容,而只插入其他值。我不能指定null/Nothing,因为它只是将ID保持为零 我可以手动添加和保存MyClass的实例,但我正在尝试让它在网格处理添加/初始化/etc新条目的地方工作。据我所知,问题不在于网格,而在于实体框
{"Cannot insert explicit value for identity column in table 'MyClasses' when IDENTITY_INSERT is set to OFF."}
任何帮助我避免将笔记本电脑扔出窗外的行为都将不胜感激 如果实体的属性是数据库中的
标识(自动递增值),则在实体模型的StorageModel中指定。对于您的特定字段,此设置可能不正确。您可以通过打开模型的edmx文件并查看StorageModels
部分来检查这一点。应该是这样的:
<edmx:StorageModels>
...
<EntityType Name="MyClass">
<Key>
<PropertyRef Name="ID" />
</Key>
<Property Name="ID" Type="..." Nullable="..." StoreGeneratedPattern="Identity" />
...
</EntityType>
...
</edmx:StorageModels>
...
...
...
StoreGeneratedPattern
必须设置为Identity
。如果存在None
或缺少属性(默认为None
),您确实会得到您描述的错误,因为EntityFramework在这种情况下不知道ID
是一个标识,并将在生成的SQL-INSERT语句中为列发出一个值
(请确保确实检查了edmx文件中的edmx:StorageModels
部分。edmx:ConceptualModels
部分在属性中也有一个属性annotation:StoreGeneratedPattern
,但其设置与您的特定问题无关。(我认为这只在从模型创建数据库时才重要,但我不确定。)如果实体的属性是标识(自动递增值)在实体模型的StorageModel中指定了数据库中的。此设置可能不适合您的特定字段。您可以通过打开模型的edmx文件并查看StorageModels
部分来检查此设置。它应该如下所示:
<edmx:StorageModels>
...
<EntityType Name="MyClass">
<Key>
<PropertyRef Name="ID" />
</Key>
<Property Name="ID" Type="..." Nullable="..." StoreGeneratedPattern="Identity" />
...
</EntityType>
...
</edmx:StorageModels>
...
...
...
StoreGeneratedPattern
必须设置为Identity
。如果存在None
或缺少属性(默认为None
)您确实得到了您描述的错误,因为EntityFramework在本例中不知道ID
是一个标识,并将在生成的SQL-INSERT语句中为列发出一个值
(请确保确实检查了edmx文件中的edmx:StorageModels
部分。edmx:ConceptualModels
部分在属性中也有一个属性annotation:StoreGeneratedPattern
,但其设置与您的特定问题无关。(我认为这只在从模型创建数据库时才重要,但我不确定。)似乎您的DB表没有标识。似乎您的DB表没有标识。奇怪的是,其他实体在EDMX中指定了SGP,在设计器中它们都有相同的设置(实体键、标识等)但只有该类缺少StoreGeneratedPattern=“Identity”在EntityType部分。到目前为止调用的XML编辑量非常令人沮丧…但是非常感谢您回答了MSDN和一些知名的ORM和.NET博客作者所不能回答的问题!我想知道如果数据库中的列是一个标识,怎么会缺少此设置。您可能稍后更改了该列吗(首次创建模型后)从DB表中的非标识列到标识列,忘记从数据库更新模型?但老实说,我甚至不确定它是否真的会自动更新。这是需要测试的东西。奇怪的是,其他实体在EDMX中指定了SGP,在设计器中它们都有相同的设置(实体键、标识等)但只有该类缺少StoreGeneratedPattern=“Identity”在EntityType部分。到目前为止调用的XML编辑量非常令人沮丧…但是非常感谢您回答了MSDN和一些知名的ORM和.NET博客作者所不能回答的问题!我想知道如果数据库中的列是一个标识,怎么会缺少此设置。您可能稍后更改了该列吗(在您第一次创建模型后)从DB表中的非标识列更改为标识列,并忘记从数据库更新您的模型?但老实说,我甚至不确定它是否真的会自动更新。这是需要测试的东西。