EF ModelValidationException类型中的每个属性名称必须是唯一的

时间:2018-04-18 14:01:49

标签: c# entity-framework entity-framework-6 ef-fluent-api

在实体框架中,我尝试根据此tutorial配置 0到多个关系。在这里,学生可以拥有 0或个联系人。但是代码在运行时显示在下面的异常。

  

System.Data.Entity.ModelConfiguration.ModelValidationException

     

StudentId:名称:类型中的每个属性名称必须是唯一的。属性   姓名' StudentId'已定义。

public class Student 
{
    public Student()
    {
        Contacts = new EntityHashSet<Contact>();
    }        
    public int StudentId { get; set; }
    public string Name { get; set; }
    public virtual IEntityHashSet<Contact> Contacts { get; private set; }
}

public class Contact 
{
    public int ContactId { get; private set; }
    public string Name { get; private set; }

    public int StudentId { get; set; }
    public virtual Student Student { get; protected set; }
}


public static void Configure(DbModelBuilder modelBuilder)
{          
    modelBuilder.Entity<Student>()
            .HasMany(e => e.Contacts)
            .WithRequired(e => e.Student)
            .HasForeignKey(e => e.StudentId);
}

我也试过删除HasForeignKey。但没有任何作用。

2 个答案:

答案 0 :(得分:1)

你忘了申报学生的钥匙

modelBuilder.Entity<Student>().HasKey(x => x.StudentId);

答案 1 :(得分:0)

首先,我认为适当的关系是一对一,一个学生可以有多个联系人(从0到多)。

我以这种方式建立了关系:

public class Student
{
    public Student()
    {
        Contacts = new HashSet<Contacts>();
    }

    public int StudentId { get; set; }
    public string Name { get; set; }
    public virtual ICollection<Contact> Contacts { get; set; }
}

public class Contact 
{
    public int ContactId { get; set; }
    public string Name { get; set; }
    public int StudentId { get; set; } //usually I use Annotations here to create the DB like.. [Column("column_name")]
    //Here I use [InverseProperty(Contact), ForeignKey("StudentId")]
    public virtual Student Student { get; set; }
}

public static void Configure(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Contacts>.HasOne(a => a.Student).WithMany(b => b.Contacts).HasForeignKey(a => a.StudentId);    
}

它应该在没有注释的情况下工作。