0

Я использую первую модель EF5. Я действительно не понимаю, что такое автогенерируемые классы из EDM. Согласно некоторым документам, это классы POCOs, но почему они используются в контексте? Предполагая, что у меня есть студенческая сущность, в моем контексте я получаю студентский класс POCO и свойство DbSet StudentSet. Будут ли следующие инструкции поместить POCO в мою базу данных?DTO/POCO с инфраструктурой Entity

MyContext.StudentSet.Add(johndoe); 
MyContext.SaveChanges(); 

Таким образом, EF использует POCO для передачи данных? На самом деле я пропускаю шаг, когда POCO обменивается данными с сущностями или DTO и когда сущности помещают данные в базу данных.

+0

Что вы пробовали, да, ваш код поместит JohnDoe в вашу базу данных. Если вы переносите данные на DTO, вам нужно установить POCO на основе свойств из DTO. –

ответ

1

Сгенерированные классы из EDM являются классами ORM/Persistence. Вы используете эти классы для запроса/внесения изменений из/в базу данных. Вам необходимо перевести любой объект DTO в объект POCO, когда нужно внести изменения в базу данных.

ORM - это сопоставление объекта с данными в базе данных, вместо того чтобы иметь дело с синтаксисом insert into для вставки записи в базу данных в приложении, вы используете StudentSet.Add для добавления новых данных. Информация johndoe будет переведена в sql-синтаксис, EF будет отображать каждое свойство в каждый столбец при переводе его в запрос.

Метод Add будет хранить johndoe в виде Added в памяти, но он не будет выполнен сразу же в базе данных. Если у вас есть другой метод Add, он будет также отмечен как Added. В тот момент, когда вы вызываете SaveChanges, все изменения будут сохранены в базе данных, отправив сгенерированный запрос.

Отображение между объектами DTO и EF происходит до того, как вы добавите johndoe. У вас может быть другой класс DTO, который используется в пользовательском интерфейсе. Вам нужно сопоставить его вручную или с помощью библиотеки карт, чтобы создать объект POCO из объекта DTO. Например:

// studentDto as parameter 

var johndoe = new Student 
{ 
    Name = studentDto.StudentName, 
    Age = studentDto.StudentAge 
}; 
MyContext.StudentSet.Add(johndoe); 

// studentDto might have another information as well 
var johndoeSubject = new Subject 
{ 
    Name = studentDto.SubjectName, 
    Years = studentDto.SubjectYears 
}; 
MyContext.SubjectSet.Add(johndoeSubject); 

MyContext.SaveChanges(); 
+0

Спасибо Yuliam, но почему вы добавляете ученика, а не StudentDto в свой контекст? – Llm

+0

@Llm, так как таблица Student в базе данных отображается в класс Student, а не класс StudentDto, вы можете открыть файл EDMX с помощью редактора xml и просмотреть конфигурацию сопоставления, которая используется EF, CSDL, SSDL и MSL. –

+0

Ok I Получи это сейчас. Поэтому я должен использовать DTO для передачи данных в мои представления? На самом деле я искал способ добавить слой между тем, что я получаю от EF, и тем, что я передаю своим представлениям, чтобы добавить некоторую безопасность ... – Llm