Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 如何在MVC 5/Web API 2.0应用程序中为Unity dependency injection和Entity Framework配置automapper?_Asp.net Mvc_Entity Framework_Unity Container_Automapper - Fatal编程技术网

Asp.net mvc 如何在MVC 5/Web API 2.0应用程序中为Unity dependency injection和Entity Framework配置automapper?

Asp.net mvc 如何在MVC 5/Web API 2.0应用程序中为Unity dependency injection和Entity Framework配置automapper?,asp.net-mvc,entity-framework,unity-container,automapper,Asp.net Mvc,Entity Framework,Unity Container,Automapper,我在MVC5应用程序中使用Automapper自动映射实体框架实体。有些映射需要查找,所以我需要将它们注入AutoMapperConfig。我使用PerRequestLifetimeManager。要进行注入,我已在应用程序中设置Unity\u BeginRequest以下几行: Mapper.Initialize(cfg => cfg.ConstructServicesUsing(type => UnityConfig.GetConfiguredContainer().Resolv

我在MVC5应用程序中使用Automapper自动映射实体框架实体。有些映射需要查找,所以我需要将它们注入AutoMapperConfig。我使用PerRequestLifetimeManager。要进行注入,我已在应用程序中设置Unity\u BeginRequest以下几行:

Mapper.Initialize(cfg => cfg.ConstructServicesUsing(type => UnityConfig.GetConfiguredContainer().Resolve(type)));
var UnityContainer = UnityConfig.GetConfiguredContainer();
UnityContainer.Resolve<AutoMapperConfig>().MapAutoMapper();
因此,存储库解析的映射显然会得到另一个DBContext。(如果忽略需要查找的属性,“everything”可以正常工作)

所以很明显我做错了什么,但我不知道是什么。出现的问题是:

  • 在何处放置Mapper.Initialize(cfg=>cfg.ConstructionServicesUsing(type=>UnityConfig.GetConfiguredContainer().Resolve(type))??在哪门课上上课
  • 上下文问题是否与使用MVC 5和Webapi 2.0的web应用程序有关?它们是否生成不同的dbcontext?我怎样才能避免这种情况
  • AutoMapper错误从何而来(对我来说似乎是错误的消息)?如何解决
编辑以回答Gert Arnold的问题:

  • DbEntityEntry方法破坏了我的DBContext
  • 当我想将EntityState设置为Modified(在存储库的更新操作中调用)时,它会中断
  • 因为我使用PerRequestLifeTimeManager,所以我假设_UserRepository.Get的生命周期就是请求的生命周期。我没有显式地处理上下文或存储库
1)
Mapper.assertconfigurationsvalid()
用于单元测试,而不是生产代码

2) 还有这个

Mapper.CreateMap<IssueDTO, Issue>()
    .ForMember(dest => dest.CreatedBy,
       opt => opt.MapFrom(
       src => _UserRepository.Get(u => u.UserID ==src.CreatedByID).FirstOrDefault()));
Mapper.CreateMap()
.ForMember(dest=>dest.CreatedBy,
opt=>opt.MapFrom(
src=>_UserRepository.Get(u=>u.UserID==src.CreatedByID.FirstOrDefault());
使用Automapper是一件可怕的事情。我无法想象它会被这样滥用。违反SRP是最糟糕的!您的映射代码进行映射和数据库查找?在这里混合责任。因此,在注入Automapper配置和其他奇怪的问题时,您会遇到很多复杂的问题。不要这样做,保持简单


让您的控制器(或)查询数据库中的实体,映射器只需将DB对象映射到视图模型即可完成它的工作。

应用程序\u Start
是正确的位置。如果没有更多的细节,剩下的就很难说了。
\u UserRepository.Get的寿命是多长?此
条目
方法在哪里运行?它的名称是什么?嗨,Gert,我已经用您的问题的答案更新了我的帖子。更有可能的是,
\u UserRepository.Get()
创建了一个新的DbContext,因此此调用返回的行使用的DbContext与您分配给它的DbContext不同。但很难说,因为您没有包含任何代码……1)我将从我的productioncode中删除它。2) 为了将DTO映射到实体,我需要数据库查找。我认为AutoMapper可以集中这个映射并减少#行。为每个映射手动创建映射器类是否更好?在每个控制器中重复映射看起来像是多次向我写入相同的代码。通过增加复杂性来减少行数——这不好。每个映射不需要映射器类-许多映射可以存在于一个类中。不需要在每个控制器中重复映射。您可以在
CreatedByID
旁边的实体中定义
public User CreatedBy{get;set;}
。并告诉EF在您通过
加载实体时加载此用户。Include(a=>a.CreatedBy)
public new virtual DbEntityEntry Entry(object obj)
{
    return base.Entry(obj);
}
Mapper.CreateMap<IssueDTO, Issue>()
    .ForMember(dest => dest.CreatedBy,
       opt => opt.MapFrom(
       src => _UserRepository.Get(u => u.UserID ==src.CreatedByID).FirstOrDefault()));