Entity framework 如何使用AutoMapper从DTO映射到实体框架代理类?

Entity framework 如何使用AutoMapper从DTO映射到实体框架代理类?,entity-framework,automapper,poco,dto,Entity Framework,Automapper,Poco,Dto,我有一个REST风格的web应用程序,它首先使用EF代码。我使用AutoMapper将我的类映射到DTO类,以便跨线传递,然后(希望如此)返回 当我从POCO类映射到DTO时,实际上是从EF代理对象开始的,因为我处理的对象是对我的DataContext执行某种查询的结果。不过,这似乎效果不错 当我作为POST请求的一部分返回DTO类时,我可以使用AutoMapper将其映射到我的POCO类,这也可以很好地工作 然而由于AutoMapper只是新的(),在EntitySet上使用Create方法而

我有一个REST风格的web应用程序,它首先使用EF代码。我使用AutoMapper将我的类映射到DTO类,以便跨线传递,然后(希望如此)返回

当我从POCO类映射到DTO时,实际上是从EF代理对象开始的,因为我处理的对象是对我的
DataContext
执行某种查询的结果。不过,这似乎效果不错

当我作为POST请求的一部分返回DTO类时,我可以使用AutoMapper将其映射到我的POCO类,这也可以很好地工作

然而由于AutoMapper只是新的(),在
EntitySet
上使用
Create
方法而不是POCO对象,因此我现在有了一个POCO类,而不是相应的EF代理类。这使得我很难将数据添加到数据库中


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

也许你可以这样做

首先创建所需的对象,然后使用该实例映射DTO对象

var poco=EntitySet.Create()

Mapper.Map<DTOtype, POCOtype>(dto, poco); 
var poco=EntitySet.Create()
地图(dto、poco);

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

[HttpPost]
public ActionResult Save(Student std)
{
    //do the stuff
}
假设Student是EF代理类,但当它使用Modelbinder绑定到表单值时,它会创建新对象,而不是与数据上下文关联的对象。所以首先,如果您在post中接受DTO,然后将它们转换为代理类,或者您首先接受代理类,则没有区别。
第二件事是,若对象已经存在于数据库中,并且您刚刚使用automapper创建了它,那个么您可以使用automapper与datacontext关联。如果是新对象,则需要调用
Add
方法将其保存在数据库中。

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

有关详细信息,请参阅,或

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

Mapper.CreateMap<TDto, TPoco>()
    .ConstructUsing((Func<TDto, TPoco>) (c => context.CreateObject<TPoco>()))
Mapper.CreateMap()
.ConstructUsing((Func)(c=>context.CreateObject())

据我所知,AutoMapper不能像某些IoC容器那样使用工厂方法进行扩展。这将是一个非常有意义的补充,但也许你必须自己贡献它!我知道的还不够多,而且。@GertArnold:太好了!你应该加上这个作为答案,我会接受的。是的,对于单个对象来说,这看起来是个不错的计划。但是,我的对象引用了我也希望转换的其他对象。(例如,具有多个LineItem对象的订单对象)。在这种情况下,我认为您建议的解决方案适用于Order对象,但不适用于LineItems?我不确定我是否理解。我的DTO比我的POCO对象简单得多(更少的字段等),所以我不能在ApicController方法中简单地从DTO切换到POCO——我确实需要“映射”它们。这就是我问题的关键所在——即,如何将它们映射到我的POCO,同时让这些POCO成为EF代理。好吧,我唯一要说的是,即使你在controller中成功接收到它们,它们也只是POCO而不是EF代理。您必须使用诸如attach(如果实体已在db中)或add(如果实体是新的)等方法将它们与EF数据上下文连接。我刚才给出了一个示例,不建议在控制器方法签名中使用db实体。“即使您设法在控制器中接收它们,它们也只是POCOs而不是EF代理。”这就是我问题的重点!我试图从我的DTO直接或通过POCO创建EF代理。