VB .NET 4 WinForms应用程序。
我有一个绑定到IEnumerable(Of MyClass)的(DevExpress)网格。 每当添加新行时,ID默认为零(0)。在尝试SaveChanges时,EntityFramework没有意识到它是一个标识字段意味着它应该忽略insert上的任何内容并只插入其他值。我不能指定null / Nothing,因为它只是将ID保持为零。
我可以手动添加和保存MyClass的实例,但我试图让它在网格处理添加/初始化/ etc新条目的地方工作。据我所知,问题不在于网格,而在于实体框架以及生成的SQL和实体类。
{"Cannot insert explicit value for identity column in table 'MyClasses' when IDENTITY_INSERT is set to OFF."}
任何有助于防止我将笔记本电脑扔到窗外的帮助都将非常感谢!
答案 0 :(得分:4)
如果在实体模型的StorageModel中指定了数据库中实体的属性是Identity
(自动递增值)。也许此设置对于您的特定字段不正确。您可以打开模型的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
,但其设置无关紧要你的具体问题。(我认为只有从模型创建数据库时才重要,但我不确定。)