EF Code First First To One。无法播种

时间:2015-06-10 07:56:32

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

我正在尝试为代码编制第一个数据库;特别是一对多的关系。无论我使用的注释和属性的组合如何,我都无法使其工作。

一门课程可以有很多申请者。我希望EF插入ApplicantId(身份)。我将设置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 Field is required”错误。我认为这是因为我没有设置ApplicantId - 即使我希望EF按惯例为我做这件事。

所以我尝试明确设置ApplicantId ......

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

但得到了同样的错误。

无法将值NULL插入列

然后我尝试明确告知EF,ApplicantID是一个标识列。

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

        //rest as before
    }

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

  

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

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

修改 我创建了一个快速控制台应用程序,其中仅包含上面的两个模型和种子方法。它没有问题。因此,我会尝试发现这个与主要解决方案之间的区别。

1 个答案:

答案 0 :(得分:0)

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

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

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

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

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