如何在 C# 项目中更新未由 EDMX 导入的 table

How to update table not imported by EDMX in C# project

我有一个 SQL 数据库 table,它连接另外两个 table。

类 (Table 1), 学生 (Table 2).

加入的table被称为Student类看起来像:1个复合主键由2列组成:StudentID(来自Students),ClassID(来自类)

当我通过 ADO.NET EDMX entity framework 数据库优先方法将我的数据库添加到我的 C# 项目时,这个加入的 table 不会作为自动生成的 cs class 文件,我想是因为它由两个外键组成。

但是,它确实被添加到我的 EDMX XML 信息中(见下文从 EDMX 中提取)。

我的问题是这个 table 包含所有正在注册 class 的学生的信息。因此,如果根据我的应用程序中的用户输入,学生应该取消注册或注册 class,我无法通过 DbContextInstance.StudentClasses.Add(studentClassObject) 或 DbContextInstance.StudentClasses.Add(studentClassObject) 更新数据库。

是否有其他方法可以在我的 C# 代码中更新此 table?

我的学生 class 确实有一个 属性 用于 Student.Classes,这允许我在我的程序中操作该数据,但不能然后推送到数据库(至于我看得出来)。

感谢任何帮助!

下面是 XML 代码,显示 ADO.NET/EDMX 知道 table,尽管没有创建实体 .cs 自动生成 class .

<EntityType Name="StudentClasses">
          <Key>
            <PropertyRef Name="StudentID" />
            <PropertyRef Name="ClassID" />
          </Key>
          <Property Name="StudentID" Type="int" Nullable="false" />
          <Property Name="ClassID" Type="int" Nullable="false" />
</EntityType>

[...]

 <EntitySet Name="StudentClasses" EntityType="Self.StudentClasses" Schema="dbo" store:Type="Tables" />

[...]

<Association Name="StudentClasses">
          <End Role="Classes" Type="Self.Class" Multiplicity="*" />
          <End Role="Students" Type="Self.Student" Multiplicity="*" />
</Association>

[...]

<AssociationSet Name="StudentClasses" Association="Self.StudentClasses">
            <End Role="Classes" EntitySet="Classes" />
            <End Role="Students" EntitySet="Students" />
</AssociationSet>

[...]

<AssociationSetMapping Name="StudentClasses" TypeName="ClassroomSchedulerModel.StudentClasses" StoreEntitySet="StudentClasses">
            <EndProperty Name="Classes">
              <ScalarProperty Name="ClassID" ColumnName="ClassID" />
            </EndProperty>
            <EndProperty Name="Students">
              <ScalarProperty Name="StudentID" ColumnName="StudentID" />
            </EndProperty>
</AssociationSetMapping>

是的,entity framework 中的这个 table 只是导航,因为 ef 足够聪明,可以检测到它只是一个部分 table,table 将每个实体都有代表,因此对于每个学生,您将拥有

virtual Collection<Class> Classes

表示该学生的所有class,反之亦然,每个class将有virtual Collection<Student> Students,表示该class中的所有学生。

要编辑这些你需要做这样的事情

// db is your database context 
//Get Student 
   var theStudent= db.Students.FirstOrDefault(x => x.id == studentid);
//Get Class, include students with it
var theClass = db.Classes.Include(x => x.Students).FirstOrDefault(x => x.id == classid);
//Update Students collection of this class, add or remove 
theClass.Students.Add(theStudent);
//or remove 
theClass.Students.Remove(theStudent);

//save changes
db.SaveChanges();
 // off topic but good to know 
// you can also do things like this, get classes of this student 
var ClassesStudent = db.Classes.where(x => x.Students.Any(s => s.id == studentid));
// or the Students of this Class
var StudentsClass = db.Students.Where(x => x.Classes.Any(c => c.id == classid));

希望这就是您要找的