DTO / POCO与实体框架

时间:2014-09-13 13:21:16

标签: entity-framework entity-framework-5 poco ef-model-first

我正在使用EF5 Model First。我真的不明白EDM中自动生成的类是什么。根据一些文档,这些类是POCO,但为什么它们在上下文中使用? 假设我有一个Student实体,那么我在上下文中得到一个Student POCO类和一个DbSet StudentSet属性。 下一条说明是否会将POCO放入我的数据库中?

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

所以EF使用POCO传输数据?实际上,我错过了POCO与实体或DTO交换数据以及实体将数据放入数据库时​​的步骤。

1 个答案:

答案 0 :(得分:2)

EDM生成的类是ORM / Persistence类。您可以使用该类从/向数据库查询/进行更改。在进行数据库更改时,您需要将任何DTO对象转换为POCO对象。

ORM是关于将对象映射到数据库中的数据,而不是处理insert into语法以将记录插入应用程序中的数据库,而是使用StudentSet.Add来添加新数据。 johndoe信息将被翻译成sql语法,EF会在将每个属性转换为查询时将每个属性映射到每个列。

Add方法会将johndoe信息作为Added存储在内存中,但不会立即执行到数据库。如果您使用其他Add方法,则也会将其标记为Added。在您调用SaveChanges的那一刻,所有更改都将通过发送生成的查询保存到数据库中。

在添加johndoe之前,DTO和EF实体之间的映射已经发生。您可能在UI中使用了另一个DTO类。您需要手动映射它或使用映射器库从DTO对象创建POCO对象。例如:

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