C# EF代码首先是一对多。不能播种
我正在尝试建立一个代码优先的数据库;特别是一对多的关系。无论我使用什么样的注释和属性组合,我都无法让它工作 一门课程可以有许多申请人。我希望EF插入应用程序ID(标识)。我要定一个星期 型号C# EF代码首先是一对多。不能播种,c#,entity-framework,ef-code-first,C#,Entity Framework,Ef Code First,我正在尝试建立一个代码优先的数据库;特别是一对多的关系。无论我使用什么样的注释和属性组合,我都无法让它工作 一门课程可以有许多申请人。我希望EF插入应用程序ID(标识)。我要定一个星期 型号 //One public class Course { public Course() { Applicants = new List<Applicant>(); } [Databas
//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; }
}
需要Id字段
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——尽管我希望EF按照惯例为我这样做
所以我尝试显式地设置应用程序ID
var applicant =
new Applicant
{
ApplicantId = 1,
CourseId = "myId",
Forename = "Ryan",
Surname = "Giggs"
};
但也犯了同样的错误
无法在列中插入空值
然后,我尝试显式地通知EF applicationId是一个标识列
public class Applicant
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int ApplicantId { get; set; }
//rest as before
}
但现在我得到了这个错误:
“应用程序ID”,表“Context1.dbo.applicator”;列不允许
空值。插入失败
注意,我的modelbuilder中没有任何代码,因为据我所知,只有在模型定义不遵循约定的情况下,才需要此代码
编辑
我创建了一个快速控制台应用程序,它只包括上面的两个模型和seed方法。它毫无问题地工作。因此,我将尝试找出此解决方案与主解决方案之间的差异 我无法确定seed验证失败的原因。正如问题更新中提到的,我能够在快速控制台应用程序中获得完全相同的关系 幸运的是,目前现有数据和以前的迁移并不重要,因此我能够删除所有迁移并从头创建数据库 这一次,seed方法没有引起任何验证错误,并按预期填充了数据 这里的答案很有用:
事实上,自从发布这个问题以来,我已经多次提到这个问题。不知何故,我正在执行的一些迁移使数据库处于一种阻止进一步更新成功的状态。如果您使用EF CF,通常不需要
[DatabaseGenerated(DatabaseGenerateOptions.Identity)]
。也许您可以尝试删除这一行?是的,我认为这是正确的。它应该按照惯例运作。但是,如果我删除该行,我会得到第一个错误-Id字段是必需的。我认为问题在于AddOrUpdate
方法。如果在DbSet
上执行了基本的Add
,则此代码工作正常。您可以发布该方法的代码吗?对于疑难解答,请尝试在单独的步骤中添加它们。context.Courses.AddOrUpdate(课程);然后抓取关键申请人。CourseId=course.CourseId,然后抓取上下文。申请人。添加或更新(申请人);您也可以尝试显式地告诉AddOrUpdate关键是什么-AddOrUpdate(c=>c.CourseId,当然),但我怀疑这是问题所在。@steveGreene非常肯定我曾经尝试过,但我会尝试一下,让您知道。