2014-09-13 123 views
0

我首先使用EF5模型。我真的不明白什么是EDM自动生成的类。根据一些文档,这些类是POCO,但为什么它们在上下文中使用? 假设我有一个Student实体,那么我在我的上下文中获得一个Student POCO类和一个DbSet StudentSet属性。 这个下一条指令会在我的数据库中放置一个POCO吗?带实体框架的DTO/POCO

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

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

+0

你有什么试过的,是的,你的代码会把JohnDoe放到你的数据库中。如果您在DTO上携带数据,则需要根据DTO的属性设置POCO。 – 2014-09-13 13:28:52

回答

1

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

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

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

DTO和EF实体之间的映射发生在添加johndoe之前。您可能会在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(); 
+0

谢谢Yuliam,但为什么你添加一个学生而不是你的上下文的StudentDto? – Llm 2014-09-13 21:45:52

+0

@Lm,因为数据库中的表Student被映射到Student类中,而不是StudentDto类,所以可以使用xml编辑器打开EDMX文件,并查看EF,CSDL,SSDL和MSL使用的映射配置。 – 2014-09-14 03:36:39

+0

Ok I现在得到它。所以我应该使用DTO将数据传递给我的视图?实际上,我正在寻找一种方法在我从EF获得的东西和我传递给我的视图以增加一些安全性之间添加一个图层... – Llm 2014-09-15 08:01:54