3

我有一个 REST 样式的 Web 应用程序,它首先使用 EF 代码。我正在使用 AutoMapper 将我的类映射到 DTO 类,以便通过网络传递,并(希望)返回。

当我从我的 POCO 类映射到 DTO 时,我实际上是从一个 EF 代理对象开始的,因为我正在处理的对象是对我的DataContext. 然而,这似乎工作正常。

当我返回一个 DTO 类作为 POST 请求的一部分时,我可以使用 AutoMapper 将它映射到我的 POCO 类上,也可以正常工作。

但是,因为 AutoMapper 只是 new()-ing POCO 对象而不是使用 上的Create方法,所以EntitySet我现在有一个 POCO 类而不是相应的 EF 代理类。这使我更难将数据添加到我的数据库等。

如何说服 AutoMapper 使用EntitySet.Create?还是有其他方法可以达到相同的效果?

4

3 回答 3

3

Map.CreateMap创建一个IMappingExpression对象,该对象具有ConstructUsing接受可用作新对象的工厂方法的函数的方法。映射的属性用于设置值。(顺便说一下,这可以被 覆盖ConvertUsing)。

有关详细信息,请参阅Automapper - 如何映射到构造函数参数而不是属性设置器AutoMapper 使用错误的构造函数如何使用 Automapper 在没有默认构造函数的情况下构造对象

在您的情况下,这可能类似于:

Mapper.CreateMap<TDto, TPoco>()
    .ConstructUsing((Func<TDto, TPoco>) (c => context.CreateObject<TPoco>()))
于 2012-08-16T20:36:42.410 回答
1

May be you can do like this,

First create the required object and then use that instance to map the DTO object,

var poco=EntitySet.Create()

Mapper.Map<DTOtype, POCOtype>(dto, poco); 
于 2012-08-07T03:36:44.493 回答
0

假设您在 post 方法中接受 POCO 对象,而不是像 DTO 这样

[HttpPost]
public ActionResult Save(Student std)
{
    //do the stuff
}

假设 Student 是 EF 代理类,但是当它使用 Modelbinder 绑定到表单值时,它会创建新对象而不是与数据上下文关联的对象。所以第一件事是,如果您在帖子中接受 DTO,然后将它们转换为代理类,或者您首先接受代理类,这没有区别。第二件事是,如果对象已经存在于数据库中并且您刚刚使用 automapper 创建了它,则可以使用attach 方法与 datacontext 关联。如果它是新对象,您将需要调用该Add方法将其保存在数据库中。

于 2012-08-07T05:31:09.200 回答