2017-05-29 94 views
0

我有一个SQL数据库表,它连接两个其他表。如何更新EDMX在C#项目中未导入的表格

班级(表1),学生(表2)。

连接表被称为StudentClasses样子:1复合主键由2列:StudentID(从学生)的ClassID(从类)

当我加入我的数据库通过ADO我的C#项目。第一种方式是使用NET EDMX实体框架数据库,这个连接表不会被添加为自动生成的cs类文件,我猜想它是由两个外键组成的。

但是,它确实会添加到我的EDMX XML信息中(请参阅下面的摘录自EDMX)。

我的问题是,这张表包含任何正在注册课程的学生的信息。因此,如果应用程序根据用户输入在我的应用程序中注销或注册了学生,我无法通过DbContextInstance.StudentClasses.Add(studentClassObject)或DbContextInstance.StudentClasses.Add(studentClassObject)更新数据库。

是否有其他方式我应该更新此表在我的C#代码?

我的Student类确实有一个Student.Classes属性,它允许我在我的程序中操作这些数据,但是不能再推送到数据库(据我所知)。

我感谢任何帮助!

下面是XML代码,它显示ADO.NET/EDMX知道该表,尽管没有创建实体.cs自动生成的类。

<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> 
+0

类实体,应该让学生收集和当你添加新的学生到收集和保存修改它应该为StudentClasses表添加新记录。你不需要直接访问。 你也可以查看下面的链接http://www.entityframeworktutorial.net/code-first/configure-many-to-many-relationship-in-code-first.aspx – Miguel

+1

你是对的,Class实体自动生成的文件还有一个Students集合:“public virtual ICollection Students {get; set;}” – zig

回答

0

是有,这个表中的实体框架是只是导航的EF是足够聪明来检测,它仅仅是一个部分表,该表将每个实体来表示,因此每个学生,你将有

virtual Collection<Class> Classes

它代表这个学生的所有课程,反之亦然,每个课程将有virtual Collection<Student> Students代表该班的所有学生。

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

// 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)); 

我希望这是你正在寻找