如何在 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));
希望这就是您要找的
我有一个 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));
希望这就是您要找的