代码之家  ›  专栏  ›  技术社区  ›  Rob

ObjectContext.SaveChanges()违反主键,引发UpdateException?

  •  2
  • Rob  · 技术社区  · 14 年前

    this MSDN documentation ...

    INSERT语句由 实体框架和 在ObjectContext上调用。

    如果插入操作成功, 写入服务器生成的值 返回ObjectStateEntry。什么时候? AcceptChanges会自动调用 在SaveChanges的末尾 服务器生成的值。

    我的代码中似乎没有出现这种情况。当我打电话的时候 ObjectContext.SaveChanges() UpdateException InnerException.Message 价值:

    “重复的键值违反了唯一约束学生\u术语\u数据\u pkey”

    以下是违规代码:

    using (DataAccessLayerEntities context = new DataAccessLayerEntities()) {
         StudentTermData mostCurrent = new StudentTermData() {
              // Foreign keys:    
              StudentId = studentId,
              TermId = currentTerm.Id,
    
              // Non-nullable properties:
              SponsorCode = string.Empty,
              AdmissionNumber = string.Empty,
              Expiration = string.Empty
         };
    
         context.StudentTermDatas.AddObject(mostCurrent);
         context.SaveChanges();  // UpdateException occurs here.
    }
    

    我已经证实了 StudentTermData.Id 在实体数据模型中标记为EntityKey。有人有什么想法或建议吗?

    2 回复  |  直到 13 年前
        1
  •  2
  •   Rob    14 年前

    this blog this Microsoft Connect ticket .

    解决方案是在文本编辑器中打开模型的.edml文件,找到 <EntityType Name="student_term_data"> XML标记,并添加 StoreGeneratedPattern="Identity" 要将属性标记用作EntityKey,请执行以下操作:

      <EntityType Name="student_term_data">
         <Key><PropertyRef Name="id" /></Key>
         <Property Name="id" Type="int" Nullable="false" StoreGeneratedPattern="Identity" />
         ...
      </EntityType>
    

    我的代码现在按预期运行。

        2
  •  0
  •   Tony Abrams    14 年前

    编辑

    如果你想做一个插入,那么不要填写PK字段(我猜这是StudentID)。