无法确定类型Error之间关联的主要结束

时间:2014-02-18 09:36:52

标签: asp.net-mvc data-annotations code-first

这是我的两个模型,我在更新数据库时在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; }

    }

1 个答案:

答案 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重新创建它。

希望这会有所帮助,祝你有愉快的一天,

阿尔贝托