Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么在实体中添加具有自己ID的集合时,我总是获取主体ID而不是集合的ID?_C#_Entity Framework_Asp.net Web Api - Fatal编程技术网

C# 为什么在实体中添加具有自己ID的集合时,我总是获取主体ID而不是集合的ID?

C# 为什么在实体中添加具有自己ID的集合时,我总是获取主体ID而不是集合的ID?,c#,entity-framework,asp.net-web-api,C#,Entity Framework,Asp.net Web Api,我正在将集合添加到现有数据集中。我有一个学生的科目仍然为空。所以我要做的就是把收集的东西贴到那个学生身上 这是我的密码: 学生 问题是外键: [ForeignKey("Id")] public Student student {get; set;} 主题表应该有一个StudentId列,指向适用的学生。事实上,你告诉受试者它的PK应该是学生ID。就像在一对一的关系中一样 在EF中,如果这是代码优先: public class Subject { [Key] pu

我正在将集合添加到现有数据集中。我有一个学生的科目仍然为空。所以我要做的就是把收集的东西贴到那个学生身上

这是我的密码:

学生


问题是外键:

    [ForeignKey("Id")]
    public Student student {get; set;}
主题表应该有一个StudentId列,指向适用的学生。事实上,你告诉受试者它的PK应该是学生ID。就像在一对一的关系中一样

在EF中,如果这是代码优先:

public class Subject
{
    [Key]
    public string Id { get; set; } // ID for the Subject

    // some codes omitted ...

    public string StudentId { get; set; } // FK to the student.
    [ForeignKey("StudentId")]
    public Student student {get; set;}
}
然而,学生和学科之间的关系可能应该是多对多的关系,其中许多学生可以与许多相同的学科相关联。一个学生有很多科目,一个科目有很多学生

为此,您需要一个名为StudentSubjects之类的链接表

StudentSubjects
StudentId [PK] [FK -> Students]
SubjectId [PK] [FK -> Subjects]
EF可以自动管理此表,只要它只包含复合键而不包含其他字段。否则,您需要将其定义为实体并手动提供映射

public class Student
{
   [Key]
   public int Id { get; set; } 

   public virtual ICollection<Subject> Subjects { get; set; } = new List<Subject>();
}

public class Subject
{
   [Key]
   public int Id { get; set; } 

   public virtual ICollection<Student> Students { get; set; } = new List<Student>();
}
如果是CodeFirst,则应设置StudentSubjects或SubjectStudents表来管理关系。否则,您可以映射HasMany.WithMany并定义表、左键和右键关系

即,对于学生实体类型配置

// EF6 Syntax. EF Core will be a tad different /w IEntityTypeConfiguration<Student> implementation.

public class StudentConfiguration : EntityTypeConfiguration<Student>
{
   public StudentConfiguration()
   {
      HasMany(x => x.Subjects)
         .WithMany(x => x.Students)
         .Map(x => x.ToTable("StudentSubjects").MapLeftKey("StudentId").MapRightKey("SubjectId"));
   }
}

我强烈建议不要对PKs使用字符串。它们对于存储和索引来说非常大,您不能使用DB端标识或默认值,例如NewSequentialId[GUID]

您可以为学生和主题映射以及实体定义包含任何映射/配置吗?这听起来像是你的科目与学生的比例是1:1。或者FK映射配置错误。@StevePy我已经添加了它。外键属性是您的问题。。在代码示例的解决方案中,我的解决方案是删除ForeignKey属性。我使用了一个导航,没有ForeignKeyWith学生参考课程,每个课程实例将只对一个学生有一个参考,当您尝试将课程添加到第二个学生时,您可能会移动该课程。否则,您将有具有相同细节的不同PK的重复课程,该课程中的每个学生一个。如果有其他相关问题,请立即询问:
StudentSubjects
StudentId [PK] [FK -> Students]
SubjectId [PK] [FK -> Subjects]
public class Student
{
   [Key]
   public int Id { get; set; } 

   public virtual ICollection<Subject> Subjects { get; set; } = new List<Subject>();
}

public class Subject
{
   [Key]
   public int Id { get; set; } 

   public virtual ICollection<Student> Students { get; set; } = new List<Student>();
}
// EF6 Syntax. EF Core will be a tad different /w IEntityTypeConfiguration<Student> implementation.

public class StudentConfiguration : EntityTypeConfiguration<Student>
{
   public StudentConfiguration()
   {
      HasMany(x => x.Subjects)
         .WithMany(x => x.Students)
         .Map(x => x.ToTable("StudentSubjects").MapLeftKey("StudentId").MapRightKey("SubjectId"));
   }
}