【问题标题】:DTO/POCO with Entity Framework带有实体框架的 DTO/POCO
【发布时间】:2014-09-13 13:21:15
【问题描述】:

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

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

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

【问题讨论】:

  • 您尝试过什么,是的,您的代码会将 JohnDoe 放入您的数据库中。如果你在 DTO 上携带数据,那么你需要根据 DTO 的属性设置 POCO。

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


【解决方案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();

【讨论】:

  • 感谢 Yuliam,但为什么要在上下文中添加 Student 而不是 StudentDto?
  • @Llm,由于数据库中的表Student映射到Student类,而不是StudentDto类,可以用xml编辑器打开EDMX文件,查看EF使用的映射配置,CSDL , SSDL 和 MSL
  • 好的,我现在明白了。所以我应该使用 DTO 将数据传递给我的视图?实际上,我正在寻找一种方法,在我从 EF 获得的内容和传递给我的视图的内容之间添加一层以增加一些安全性......
  • @Llm,我不建议为视图创建 DTO,因为还有其他帖子对此进行了描述,例如 this onethis one,但如果您有 DTO 实体并且想要要对数据库进行更改,您需要将 DTO 实体转换为 ORM 实体。除此之外,您还需要更多帮助吗?
猜你喜欢
  • 2011-08-21
  • 2012-01-09
  • 2012-03-08
  • 1970-01-01
  • 1970-01-01
  • 2011-08-20
  • 2011-08-19
  • 2012-03-22
  • 2011-05-09
相关资源
最近更新 更多