Как обновить таблицу, не импортированную EDMX в проекте С#

У меня есть таблица базы данных SQL, которая объединяет две другие таблицы.

Классы (таблица 1), студенты (таблица 2).

Объединенная таблица называется StudentClasses и выглядит следующим образом: 1 Составной первичный ключ, состоящий из 2 столбцов: StudentID (от студентов), ClassID (от классов)

Когда я добавляю свою базу данных в свой проект C# с помощью первого подхода к базе данных инфраструктуры сущностей ADO.NET EDMX, эта объединенная таблица не добавляется как автоматически сгенерированный файл класса cs, я полагаю, потому что он состоит из двух внешних ключей.

Однако он добавляется к моей XML-информации EDMX (см. ниже извлеченный из EDMX).

Моя проблема в том, что эта таблица содержит информацию о любом студенте, зарегистрированном в классе. Поэтому, если учащийся должен быть незарегистрирован или зарегистрирован в классе на основе пользовательского ввода в моем приложении, я не могу обновить базу данных с помощью DbContextInstance.StudentClasses.Add(studentClassObject) или DbContextInstance.StudentClasses.Add(studentClassObject).

Есть ли другой способ обновить эту таблицу в моем коде С#?

В моем классе 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>

person zig    schedule 29.05.2017    source источник
comment
Объект Classes должен иметь коллекцию студентов, и когда вы добавляете нового студента в эту коллекцию и сохраняете изменения, он должен добавить новую запись в таблицу StudentClasses. Вам не нужно обращаться напрямую. Вы также можете проверить следующую ссылку entityframeworktutorial.net/code-first/   -  person Miguel    schedule 29.05.2017
comment
Вы правы, в автоматически сгенерированном файле объекта Class также есть коллекция Student: public virtual ICollection‹Student› Студенты { get; задавать; }   -  person zig    schedule 29.05.2017


Ответы (1)


Да, эта таблица в структуре сущностей - это просто навигация, поскольку 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));

Я надеюсь, это то, что вы ищете

person Munzer    schedule 29.05.2017