我正在尝试为代码编制第一个数据库;特别是一对多的关系。无论我使用的注释和属性的组合如何,我都无法使其工作。
一门课程可以有很多申请者。我希望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失败。
注意我的模型构建器中没有任何代码,因为我的理解只有在模型定义不遵循惯例时才需要这样做。
修改 我创建了一个快速控制台应用程序,其中仅包含上面的两个模型和种子方法。它没有问题。因此,我会尝试发现这个与主要解决方案之间的区别。
答案 0 :(得分:0)
我无法确定验证失败的原因。正如问题更新中所提到的,我能够在快速控制台应用程序中获得完全相同的关系。
幸运的是,现有的数据和先前的迁移并不重要,因此我能够删除所有迁移并从头开始创建数据库。
这一次,种子方法引发了没有验证错误,并按预期填充了数据。
这里的答案很有用:How to re-create database for Entity Framework?
事实上,自从发布这个问题以来,我不得不这样做几次。不知何故,我正在执行的某些迁移会使数据库处于阻止进一步更新成功的状态。