实体框架SaveChanges - 如何忽略INSERT上的ID / Identity字段

时间:2010-06-20 14:34:37

标签: vb.net entity-framework linq-to-entities identity xtragrid

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."}

任何有助于防止我将笔记本电脑扔到窗外的帮助都将非常感谢!

1 个答案:

答案 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,但其设置无关紧要你的具体问题。(我认为只有从模型创建数据库时才重要,但我不确定。)