2015-04-20 2 views
0

У меня есть два класса в приложении для окон. Скажем, Student и StudentDetails, где по классу StudentDetails также является собственностью Student класс.populating A Класс, который имеет другой класс как свойство

У меня есть хранимая процедура, которая получает данные из обеих таблиц в базе данных. Мне нужно знать, как этот сценарий обычно обрабатывается, что означает, что обычно используется Студенческий класс. Большое спасибо за ответы. Любая ссылка на аналогичный сценарий wold будет большой.

вот мой код:

class Student 
    { 
     public int StudentID { get; set; } 
     public string StudentName { get; set; } 
     public StudentDetails StudentDetails { get; set; } 

     public Student() 
     { 
      this.StudentID = 0; 
      this.StudentName = String.Empty; 
      this.StudentDetails = new StudentDetails(); 
     } 

    } 

class StudentDetails 
    { 

     public int StudentDetailsID { get; set; } 
     public string Address { get; set; } 
     public int Height { get; set; } 
     public int Weight { get; set; } 

     public StudentDetails() 
     { 
      this.StudentDetailsID = 0; 
      this.Address = String.Empty; 
      this.Height = 0; 
      this.Weight = 0; 

     } 

    } 

В приведенной ниже класс имеет функцию, которая заполняет Student Class (FillStudent())

Class StudentAssembler 
     { 

      public List<Model.Student> FillStudent() 
      { 
       List<Model.Student> StudentCollection = new List<Model.Student>(); 
       Model.Student StudentDTO = new Model.Student(); 
       try 
       { 
        using (Model.dbConnection dbconnection = new Model.dbConnection(Utilities.SqlConnStr)) 
        { 

         SqlDataReader dr; 
         SqlCommand command = new SqlCommand("GetStudents", dbconnection.connection); 
         command.CommandType = CommandType.StoredProcedure; 
         dbconnection.OpenConn(); 
         dr = command.ExecuteReader(); 
         while (dr.Read()) 
         { 
          StudentDTO.StudentID = dr[0] == DBNull.Value ? 0 : (int)dr[0]; 
          StudentDTO.StudentName = dr[1] == DBNull.Value ? String.Empty : (String)dr[1]; 

//this is the part that i need to know how is it usually handled 

//StudentDTO.StudentDetails = how to fill out this part ??? 
           StudentCollection.Add(StudentDTO); 
          } 

          return StudentCollection; 
         } 
        } 
        catch (Exception) 
        { 
         return null; 
        } 
       } 
      } 

EDIT:

Stored Код процедуры

select s.StudentID,s.StudentName,sd.StudentDetailsID,sd.Address, 
sd.Height,sd.Weight 
from Student s,StudentDetails sd 
where s.StudentID = sd.StudentID 
+1

Это зависит от того, что возвращает процедура «GetStudents». Если детали находятся там, вы можете просто создать новый экземпляр StudentDetails и установить свойства. Это не очень хороший способ справиться с такими вещами? Почему бы не использовать Entity Framework? – Andrew

+1

@ Псевдоним: «код сломался, пожалуйста, помогите» явно не относится к теме обзора кода. Потратьте минутку, чтобы посмотреть, какие вопросы можно задать там: http://codereview.stackexchange.com/help/dont-ask –

+0

@Pseudonym спасибо за комментарий, На самом деле я не работаю с опубликованным кодом, я только положил его в качестве примера мне просто нужна помощь в поиске того, как справиться с похожим сценарием, что является лучшей практикой или лучшим шаблоном дизайна :) –

ответ

0

у вас есть два варианта

1: отдельный sproc (или SQL), чтобы получить информацию из таблицы Шарля студента подробно studentID. называют это на студента

2: присоединиться к таблице студентов детали в вашем sproc/SQL и заполнить оба с одной и той же строки данных

Вариант 1: как правило, чище и многоразовые. Я бы сказал, что это должен быть ваш первый подход.

Однако, если вам нужно извлечь много студентов, вариант 2 будет намного быстрее. так как ему нужен только один вызов db.

Также у вас есть отношения 1 к 1 между учеником и studendetails, поэтому нет причин не использовать вариант 2. Если, однако, у вас есть много деталей для одного ученика, вы все равно можете использовать опцию 2, пропуская дубликат студенческая информация. Это часто может быть лучшим способом, даже если вы возвращаете больше данных, чем требуется от SQL

+0

относительно первого варианта, который сначала был моей первой попыткой, но я думал искать лучшие способы, если они существуют. в отношении второго варианта исправьте меня, если я ошибаюсь, теперь у меня будет 3 DataObjects Student, StudentDetails и отдельный для моей хранимой процедуры. Думаю, это приведет к ненужному дублированию кода. –

+1

вам не нужно создавать третье dto, просто заполните как – Ewan

1

Учитывая хранимую процедуру запроса, вы могли бы просто:

StudentDTO.StudentDetails = new StudentDetails 
{ 
    StudentDetailsID = dr[2] == DBNull.Value ? 0 : (int)dr[2], 
    Address = dr[3] == DBNull.Value ? String.Empty : (String)dr[3], 
    ... 
}; 
0

Вы можете создать отдельные функции, чтобы получить студент и студент Подробная информация. Таким образом, вы можете повторно использовать эти функции везде в коде.

E.g. для student вы могли бы иметь функцию, как этот

public Student CreateStudent(IDataRecord iDataRecord) 
    { 
     Student stud = new Student(); 
     stud.Id = GetValue<int>(iDataRecord, "Id"); 
     stud.Name = GetValue<string>(iDataRecord, "Name"); 
     return stud; 
    } 

для studentDetails, создать такую ​​функцию:

 public StudentDetails CreateStudentDetails(IDataRecord iDataRecord) 
    { 
     StudentDetails studDetails = new StudentDetails(); 
     studDetails.Id = GetValue<int>(iDataRecord, "Id"); 
     studDetails.Address = GetValue<string>(iDataRecord, "Address"); 
     studDetails.Height = GetValue<string>(iDataRecord, "Height"); 
     studDetails.Weight = GetValue<string>(iDataRecord, "Weight"); 
     return studDetails; 
    } 

Затем в методе FillStudent, просто вызовите:

Student student=this.CreateStudent(dr); 
student.StudentDetails=this.CreateStudentDetails(dr); 

Пожалуйста обратите внимание, что этот код предназначен только для иллюстрации.Вы можете еще раз изменить этот код, чтобы поместить его отдельно, создав классы фабрики.