这是我的两个模型,我在更新数据库时在asp.net mvc5 codefirst上收到此错误
错误:无法确定类型'ModulericaV1.Areas.Hr.Models.HrDepartment'和'ModulericaV1.Areas.Hr.Models.HrPerson'之间关联的主要结束。必须使用关系流畅API或数据注释显式配置此关联的主要结尾。
DEPARTMENT
public class HrDepartment
{
[Key]
public int Id { get; set; }
[Display(Name = "Departman Adı")]
public string Name { get; set; }
public int? HrDepartmentId { get; set; }
[ForeignKey("HrDepartmentId")]
public virtual HrDepartment RelatedDepartment { get; set; }
public int HrPersonId { get; set; }
public virtual HrPerson HrPerson { get; set; }
}
PERSON
public class HrPerson
{
public int Id { get; set; }
[Display(Name = "Ad")]
public string Name { get; set; }
[Display(Name = "Departman")]
public int HrDepartmentId { get; set; }
public virtual HrDepartment HrDepartment { get; set; }
}
答案 0 :(得分:2)
您必须覆盖DbContext的OnModelCreating方法。 尝试这样的事情:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<HrDepartment>().HasRequired(a=>a.HrPerson ).WithRequiredDependent(b=>b.HrDepartment);
}
或者这个:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<HrDepartment>().HasRequired(a=>a.HrPerson ).WithRequiredPrincipal(b=>b.HrDepartment);
}
这些之间的差异在于主要目的。 我不得不说我没有尝试,只是写下我记得的内容,因此可能会有很少的错误,但是做这样的事情你就能解决这个错误。
此外,您还可以设置级联删除设置.WillCascadeOnDelete(false)
(true是默认值)。
回答评论问题: 我认为EF不会创建数据库约束,因为如果两者都是必需的,那么你就不能插入A,因为你需要B已经创建(否则检查失败)并且B还不能创建,因为它需要A(对于同样的原因)。因此,您可以在没有约束的情况下工作,但必须在每个SaveChanges()之前以编程方式检查或重新设计模型。事实上,我认为你没有必需的关系而是1:N,因为一个部门必须有责任但是一个人可以负责零到N个部门。
因此,我要做的是:
1)保持HrDep原样
2)删除
[Display(Name = "Departman")]
public int HrDepartmentId { get; set; }
public virtual HrDepartment HrDepartment { get; set; }
3)替换
modelBuilder.Entity<HrDepartment>().HasRequired(a=>a.HrPerson ).WithRequiredPrincipal(b=>b.HrDepartment);
带
modelBuilder.Entity<HrDepartment>().HasRequired(a => a.HrPerson ).WithMany().WillCascadeOnDelete(false);
请注意,在db update上,由于现有的数据库结构会出现错误,因此最快的方法是删除DB并让EF重新创建它。
希望这会有所帮助,祝你有愉快的一天,
阿尔贝托