【问题标题】:EF Code First One To Many. Cannot SeedEF 代码第一对多。不能播种
【发布时间】:2015-06-10 07:56:31
【问题描述】:

我正在尝试播种代码优先数据库;特别是一对多的关系。无论我使用何种注释和属性组合,我都无法让它发挥作用。

一个课程可以有多个申请人。我希望 EF 插入申请人 ID(身份)。我会设置 CourseId

模型

    //One
    public class Course
    {
        public Course()
        {
            Applicants = new List<Applicant>();
        }
        [DatabaseGenerated(DatabaseGeneratedOption.None)]
        public string CourseId { get; set; }

        public virtual ICollection<Applicant> Applicants { get; set; }
   }

    //Many
    public class Applicant
    {
        public int ApplicantId { get; set; }

        public string CourseId { get; set; }

        [ForeignKey("CourseId")]
        public virtual Course Course { get; set; } 
    }

种子

    var course = new Data.Models.Course
    {
          CourseId = "myId",
          Email = "myemail@email.com"
    };

    var applicant =
                new Applicant
               {
                   CourseId = "myId",
                   Forename = "Ryan",
                   Surname = "Giggs"
               };

   course.Applicants.Add(applicant);
   context.Courses.AddOrUpdate(course);

Id 字段为必填项

上面的模型和种子给我一个“需要 Id 字段”错误。我认为这是因为我没有设置申请人 ID - 尽管我希望 EF 按照惯例为我执行此操作。

所以我尝试明确设置申请人Id...

   var applicant =
                    new Applicant
                   { 
                       ApplicantId = 1,
                       CourseId = "myId",
                       Forename = "Ryan",
                       Surname = "Giggs"
                   };

但遇到了同样的错误。

无法将值 NULL 插入列中

然后,我尝试明确通知 EF,申请人 ID 是一个身份列。

    public class Applicant
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int ApplicantId { get; set; }

        //rest as before
    }

但现在我得到了这个错误:

'ApplicantId',表'Context1.dbo.Applicant';列不允许 空值。插入失败。

请注意,我的模型构建器中没有任何代码,因为据我了解,只有在模型定义不遵循约定时才需要这样做。

编辑 我创建了一个快速控制台应用程序,其中仅包含上述两个模型和种子方法。它可以毫无问题地工作。因此,我将尝试找出这与主要解决方案之间的区别。

【问题讨论】:

  • 如果您使用的是 EF CF,通常不需要 [DatabaseGenerated(DatabaseGeneratedOption.Identity)]。也许您可以尝试删除此行?
  • 是的,我就是这么想的。它应该按惯例工作。但是,如果我删除该行,我会收到第一个错误 - 需要 Id 字段。
  • 我认为问题在于您的AddOrUpdate 方法。如果您在DbSet 上执行了基本的Add,则此代码可以正常工作。你能发布该方法的代码吗?
  • 对于疑难解答,请尝试在单独的步骤中添加它们。 context.Courses.AddOrUpdate(course);然后抓住关键的申请者。CourseId = course.CourseId 然后是 context.Applicants.AddOrUpdate(applicant);您也可以尝试明确告诉 AddOrUpdate 关键是什么 - AddOrUpdate(c => c.CourseId, course) 但我怀疑这是问题所在。
  • @steveGreene 很确定我曾经尝试过,但我会试一试并告诉你。

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


【解决方案1】:

我无法确定种子验证失败的原因。如问题更新中所述,我能够在快速控制台应用程序中获得完全相同的关系。

幸运的是,目前,现有数据和之前的迁移并不重要,因此我能够删除所有迁移并从头开始创建数据库。

这次种子方法没有引发验证错误,并且按预期填充了数据。

这里的答案很有用:How to re-create database for Entity Framework?

事实上,自从发布这个问题以来,我不得不这样做几次。不知何故,我正在执行的一些迁移使数据库处于阻止进一步更新成功的状态。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-02
    • 1970-01-01
    • 2021-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多