2017-05-29 99 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)); 

我希望這是你正在尋找