c# - 将数据插入作为主键外键一部分的表中 - 实体框架
问题描述
我正在尝试写入具有两部分主键的表。其中一个是来自另一个表的外主键。我能够创建这个表,但不能插入。
我正在使用实体框架 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 时,无法在表“教室”中插入标识列的显式值。
解决方案
Classroom
看起来构成主键的表中的两列之一是一IDENTITY
列 - 我猜,它是Id
.
您需要使用数据注释来装饰该列,以告诉 EF 这是一个 Identity 列,并且您不会为它提供任何值:
class Classroom
{
[Key]
[Column(Order = 0)]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
....
}
这应该可以解决您的问题。但是:如果这是一个身份列 - 那么你为什么要创建一个复合 PKSchoolId
呢?这似乎完全没有必要,因为该Id
列本身已经是您的 PK - 它唯一且可靠地标识 eac 和表中的每一行.....
推荐阅读
- javascript - 使用电子在多个回调函数中返回值时出错
- spring - 如何在 @Aspect 类中调用 @RateLimiter 注释
- apache-spark - Spark广播时间长
- zsh - Pixar Renderman 在 macOS Catalina 中使用 ZSH 的环境变量
- mysql - Mysql布尔全文搜索使用加号图标和速率图标
- angular - 将 http 选项设置为 'responseType: 'text'' 会导致带有角度 HttpClient 的 http post 请求编译失败
- firebase - 使用 Firestore 云功能向多个用户发送推送通知
- c# - 通过 ASP.NET C# 中的存储过程获取特定列的值
- python - 正则表达式匹配表中具有多行的字符串
- android - Flutter 在发布 apk/bundle 时无法与 firebase 一起正常工作