首页 > 解决方案 > 将数据插入作为主键外键一部分的表中 - 实体框架

问题描述

我正在尝试写入具有两部分主键的表。其中一个是来自另一个表的外主键。我能够创建这个表,但不能插入。

我正在使用实体框架 6.4.0

我的数据库是由以下代码创建的:

class School
{
      public int Id { get; set; }
      public string Name { get; set; }
      public List<Classroom> Classrooms { get; set; }
}

class Classroom
{
      [Key]
      [Column(Order = 0)]
      public int Id { get; set; }

      [Key]
      [Column(Order = 1)]
      [ForeignKey("School")]
      public int SchoolId { get; set; }
      public School School { get; set; }
      public string Name { get; set; }
}

class TestDbContext : DbContext
{
      public DbSet<School> Schools { get; set; }
      public DbSet<Classroom> Classrooms { get; set; }
} 

如何将数据插入Classrooms表中?我试过这个(学校名称:schoolName在db中):

var context = new TestDbContext();`

var school = context.Schools.FirstOrDefault(s => s.Name == "SchoolName");
context.Classrooms.Add(new Classroom() {Name = "5B", School = school});
context.SaveChanges();

此代码的结果是此错误:

当 IDENTITY_INSERT 设置为 OFF 时,无法在表“教室”中插入标识列的显式值。

标签: c#entity-framework

解决方案


Classroom看起来构成主键的表中的两列之一是一IDENTITY列 - 我猜,它是Id.

您需要使用数据注释来装饰该列,以告诉 EF 这是一个 Identity 列,并且您不会为它提供任何值:

class Classroom
{
      [Key]
      [Column(Order = 0)]
      [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
      public int Id { get; set; }
      ....
}

这应该可以解决您的问题。但是:如果这是一个身份列 - 那么你为什么要创建一个复合 PKSchoolId呢?这似乎完全没有必要,因为该Id列本身已经是您的 PK - 它唯一且可靠地标识 eac 和表中的每一行.....


推荐阅读