【发布时间】: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