【问题标题】:Error inserting object with one-to-zero-or-one relation插入具有一对零或一关系的对象时出错
【发布时间】:2019-07-10 20:55:00
【问题描述】:

考虑一个课程是否有一个课程。所以 Course 和 Curriculum 之间的关系是 1..0 或 1..1。 这些类是:

public class Course
{
    public int Id {get; set;}
    public Curriculum { get; set; }
}


public class Curriculum 
{ 
    [ForeignKey("Course")]
    public int Id { get; set; }     

    public Course Course { get; set; }     
}

我通过 fluent api 配置了如下关系:

public class CourseConfiguration : EntityTypeConfiguration<Course>
{
    public CourseConfiguration()
    {
        HasOptional(course => course.Curriculum)
            .WithRequired(cur => cur.Course);
    }
}

不幸的是,当我想在数据库中保存课程时,会出现此错误:

当 IDENTITY_INSERT 设置为 OFF 时,无法为表“课程”中的标识列插入显式值

另外,我在 Curriculum 类的主键中添加了[DatabaseGenerated(DatabaseGeneratedOption.Identity)][DatabaseGenerated(DatabaseGeneratedOption.None)] 属性,但没有效果或产生新的异常!

你有什么想法吗?

【问题讨论】:

    标签: c# entity-framework insert ef-code-first entity-relationship


    【解决方案1】:

    我拿走了你的代码,它成功了:

    > public class MyContext : DbContext
    >     {
    >         public DbSet<Curriculum> Curriculum { get; set; }
    >         public DbSet<Course> Course { get; set; }
    > 
    >         protected override void OnModelCreating(DbModelBuilder modelBuilder)
    >         {
    >             base.OnModelCreating(modelBuilder);
    >             modelBuilder.Configurations.Add(new CourseConfiguration());
    >         }
    >     }
    >     public class Course
    >     {
    >         [DatabaseGenerated(DatabaseGeneratedOption.None)]
    >         public int Id { get; set; }
    >         public Curriculum Curriculum { get; set; }
    >     }
    > 
    >     public class CourseConfiguration : EntityTypeConfiguration<Course>
    >     {
    >         public CourseConfiguration()
    >         {
    >             HasOptional(course => course.Curriculum)
    >                 .WithRequired(cur => cur.Course);
    >         }
    >     }
    >     public class Curriculum
    >     {
    >         [ForeignKey("Course")]
    >         public int Id { get; set; }
    > 
    >         public Course Course { get; set; }
    >     }
    

    但是,在您的情况下,由于表是在身份设置为 true 的情况下首先创建的,因此 EF 不会为您更改它。如果您在第一次迁移时在 Course 的 Id 属性上具有以下属性,则不会出现问题:

    [DatabaseGenerated(DatabaseGeneratedOption.None)]

    为了解决您的问题,您需要重新创建表 Course。 以下链接也可以帮助您: https://stackoverflow.com/a/18917348/2348125

    【讨论】:

    • 感谢@rad,但是 Course 类中的 id Id 实际上是 Identity,将其更改为 None 会对其他类和表产生很大影响。
    • 抱歉,我将课程与课程混淆了。对课程(重新创建表)执行相同的操作并检查结果。如果它不起作用,请将插入问题的代码添加到您的问题中。
    • 我在Curriculum表上试过了,但是由于Curriculum表和其他表之间有很多关系,更新数据库会产生很多错误。此外,我不想手动处理课程的 ID。我无法理解原因,但我已经多次实现了具有相似结构和关系的实体。
    • 该错误表明您正在尝试将一条记录插入到表中,该记录在标识设置为 true 的列中具有显式值。因此,如果这是您想要的,那么问题可能出在插入语句中,您可能在其中尝试为 Id 插入显式值。
    猜你喜欢
    • 1970-01-01
    • 2014-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-25
    • 1970-01-01
    • 1970-01-01
    • 2019-07-25
    相关资源
    最近更新 更多