Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/29.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
C# 自动映射器,映射器未初始化。使用正确的配置调用initialize_C#_Asp.net_Asp.net Mvc_Automapper - Fatal编程技术网

C# 自动映射器,映射器未初始化。使用正确的配置调用initialize

C# 自动映射器,映射器未初始化。使用正确的配置调用initialize,c#,asp.net,asp.net-mvc,automapper,C#,Asp.net,Asp.net Mvc,Automapper,当我尝试将数据提交到数据库时,出现以下错误: {“成功”:false,“错误”:true,“错误类型”:2,“消息”:"System.InvalidOperationException:映射器未初始化。请使用适当的配置调用Initialize。如果您试图通过容器或其他方式使用映射器实例,请确保没有任何对静态映射器.Map方法的调用,如果您\u0027正在使用ProjectTo或UseAsDataSource扩展方法,请确保传入e适当的IConfigurationProvider实例。\r\n位于

当我尝试将数据提交到数据库时,出现以下错误:

{“成功”:false,“错误”:true,“错误类型”:2,“消息”:"System.InvalidOperationException:映射器未初始化。请使用适当的配置调用Initialize。如果您试图通过容器或其他方式使用映射器实例,请确保没有任何对静态映射器.Map方法的调用,如果您\u0027正在使用ProjectTo或UseAsDataSource扩展方法,请确保传入e适当的IConfigurationProvider实例。\r\n位于AutoMapper.Mapper.get_instance()\r\n位于AutoMapper.Mapper.Map(对象源、对象目标、类型sourceType、类型destinationType)\r\n位于GoalPear.Web.Areas.PM.Controllers.CompanyController.SaveData(CompanyFormViewModel CompanyFormViewModel)

请告诉我为什么我会犯这个错误,因为经过这么多的努力我还是没能弄明白

这是我的控制器代码

public CompanyController() { }
private readonly ICompanyService _companyService;
public CompanyController(ICompanyService companyService) {
    _companyService = companyService;
}
这是控制器中的SaveData方法

[HttpPost]
public JsonResult SaveData(CompanyFormViewModel companyFormViewModel)
{
    try
    {
        int? id = null;
        Company company;
        if (companyFormViewModel.Id == null)
        {
            company = new Company();
        }
        else
        {
            id = (int)companyFormViewModel.Id;
            company = _companyService.GetCompany((int)id);
        }

        company = (Company)Mapper.Map(
            companyFormViewModel, 
            company, 
            typeof(CompanyFormViewModel), 
            typeof(Company));
        CompanyValidator companyValidator = new CompanyValidator();
        ValidationResult validationResult = companyValidator.Validate(company);

        if (validationResult.IsValid) //check for any validation errors
        {
            if (id == null)
            {
                _companyService.CreateCompany(company);
            }
            else
            {
                _companyService.Update(company);
            }

            _companyService.SaveCompany();
            return new JsonSuccessResult();
        }
        else
        {
            Response.StatusCode = (int)ResponseCode.UnprocessableEntity;
            return new JsonErrorResult(validationResult);
        }
    }
    catch (Exception ex)
    {
        Response.StatusCode = (int)ResponseCode.UnprocessableEntity;
        return new JsonErrorResult(ex.ToString());
    }
}
我的表单视图代码

@using (Html.BeginForm("SaveData", "Company", FormMethod.Post, new { @class = "", @id = "validate", @role = "form" })) { 
@*<form id="validate" method="POST" action="javascript:alert('Form #validate submited');">*@
<div class="head tac">
    <h1>Register Your Company With Us!!!</h1>
</div>
<div class="block">
    <div class="header">
        <div class="side pull-right">
            <button class="btn btn-default btn-clean" onclick="clear_form('#validate');" type="button">Clear form</button>
    </div>
</div>

<div class="content controls">
    <div class="form-row">
        <div class="col-md-3">Company Name:</div>
            <div class="col-md-9">
                @Html.EditorFor(model => model.Name, new { htmlAttributes = new { @class = "validate[required,maxSize[100]]", @placeholder = @Html.DisplayNameFor(model => model.Name) } })

            </div>
        </div>
        <div class="form-row">
            <div class="col-md-3">Owner Name:</div>
                <div class="col-md-9">
                    @Html.EditorFor(model => model.Owner, new { htmlAttributes = new { @class = "validate[required,maxSize[60]]", @placeholder = @Html.DisplayNameFor(model => model.Owner) } })

                </div>
            </div>
            <div class="form-row">
                <div class="col-md-3">Email:</div>
                    <div class="col-md-4">
                        @Html.EditorFor(model => model.Email, new { htmlAttributes = new { @class = "validate[required,maxSize[60]]" ,@type="email", @placeholder = @Html.DisplayNameFor(model => model.Email) } })
                    </div>
                </div>
                <div class="form-row">
                    <div class="col-md-3">Password:</div>
                    <div class="col-md-9">
                        @Html.EditorFor(model => model.Password, new { htmlAttributes = new { @class = "validate[required,maxSize[100]]", @type="password", @id="password", @placeholder = @Html.DisplayNameFor(model => model.Password) } })


                    </div>
                </div>
                <div class="form-row">
                    <div class="col-md-3">Confirm Password:</div>
                    <div class="col-md-9">
                        @Html.EditorFor(model => model.Password, new { htmlAttributes = new { @class = "validate[required,equals[password]]", @type = "password", @placeholder = @Html.DisplayNameFor(model => model.Password) } })

                    </div>
                </div>
        @* I have omitted some code from here for saving your time to read*@  

                <div class="form-row">
                    <div class="col-md-3">Address:</div>
                    <div class="col-md-9">

                        @Html.EditorFor(model => model.Address, new { htmlAttributes = new { @class = "validate[required,maxSize[60]]", @placeholder = @Html.DisplayNameFor(model => model.Address) } })
                    </div>
                </div>
            </div>
            <div class="footer">
                <div class="side pull-right">
                    <div class="btn-group">
                        <button class="btn btn-default" type="button" onclick="$('#validate').validationEngine('hide');">Hide prompts</button>
                        <button class="btn btn-success" type="submit">Submit</button>
                    </div>
                </div>
            </div>
        </div>
   }
这是ViewModel代码

public CompanyFormViewModel() { }
public int? Id { get; set; }
[DisplayName(" Company Name")]
public string Name { get; set; }
[DisplayName("Owner")]
public string Owner { get; set; }
[DisplayName("Email")]
public string Email { get; set; }
[DisplayName("Password")]
public string Password { get; set; }
[DisplayName("Address")]
public string Address { get; set; }
以下是DomainToViewModelMapping配置文件

cfg.CreateMap<Company, CompanyFormViewModel>()
    .ForMember(vm => vm.Id, map => map.MapFrom(m => m.Id))
    .ForMember(vm => vm.Name, map => map.MapFrom(m => m.Name))
    .ForMember(vm => vm.Owner, map => map.MapFrom(m => m.Owner))
    .ForMember(vm => vm.Email, map => map.MapFrom(m => m.Email))
    .ForMember(vm => vm.Password, map => map.MapFrom(m => m.Password))
    .ForMember(vm => vm.Address, map => map.MapFrom(m => m.Address));
cfg.CreateMap<CompanyFormViewModel, Company>()
    .ForMember(m => m.Id, map => map.MapFrom(vm => vm.Id))
    .ForMember(m => m.Name, map => map.MapFrom(vm => vm.Name))
    .ForMember(m => m.Owner, map => map.MapFrom(vm => vm.Owner))
    .ForMember(m => m.Email, map => map.MapFrom(vm => vm.Email))
    .ForMember(m => m.Password, map => map.MapFrom(vm => vm.Password))
    .ForMember(m => m.Address, map => map.MapFrom(vm => vm.Address));
cfg.CreateMap()
.ForMember(vm=>vm.Id,map=>map.MapFrom(m=>m.Id))
.ForMember(vm=>vm.Name,map=>map.MapFrom(m=>m.Name))
.ForMember(vm=>vm.Owner,map=>map.MapFrom(m=>m.Owner))
.ForMember(vm=>vm.Email,map=>map.MapFrom(m=>m.Email))
.ForMember(vm=>vm.Password,map=>map.MapFrom(m=>m.Password))
.ForMember(vm=>vm.Address,map=>map.MapFrom(m=>m.Address));
我的viewModeltoDomainMapping配置文件

cfg.CreateMap<Company, CompanyFormViewModel>()
    .ForMember(vm => vm.Id, map => map.MapFrom(m => m.Id))
    .ForMember(vm => vm.Name, map => map.MapFrom(m => m.Name))
    .ForMember(vm => vm.Owner, map => map.MapFrom(m => m.Owner))
    .ForMember(vm => vm.Email, map => map.MapFrom(m => m.Email))
    .ForMember(vm => vm.Password, map => map.MapFrom(m => m.Password))
    .ForMember(vm => vm.Address, map => map.MapFrom(m => m.Address));
cfg.CreateMap<CompanyFormViewModel, Company>()
    .ForMember(m => m.Id, map => map.MapFrom(vm => vm.Id))
    .ForMember(m => m.Name, map => map.MapFrom(vm => vm.Name))
    .ForMember(m => m.Owner, map => map.MapFrom(vm => vm.Owner))
    .ForMember(m => m.Email, map => map.MapFrom(vm => vm.Email))
    .ForMember(m => m.Password, map => map.MapFrom(vm => vm.Password))
    .ForMember(m => m.Address, map => map.MapFrom(vm => vm.Address));
cfg.CreateMap()
.ForMember(m=>m.Id,map=>map.MapFrom(vm=>vm.Id))
.ForMember(m=>m.Name,map=>map.MapFrom(vm=>vm.Name))
.ForMember(m=>m.Owner,map=>map.MapFrom(vm=>vm.Owner))
.ForMember(m=>m.Email,map=>map.MapFrom(vm=>vm.Email))
.ForMember(m=>m.Password,map=>map.MapFrom(vm=>vm.Password))
.ForMember(m=>m.Address,map=>map.MapFrom(vm=>vm.Address));

为什么映射器未初始化时出现此错误?

您需要使用通过配置创建的映射器实例,而不是使用静态的
mapper.Map
方法,如下所示:

var mapper = cfg.CreateMapper();
var company = (Company)mapper.Map(companyFormViewModel, company, typeof(CompanyFormViewModel), typeof(Company));
在最新版本中,使用映射器的首选方法是通过
IMapper
接口。如果您也使用DI容器,则可以通过
config.CreateMapper()
方法重载绑定/注册
IMapper
来解析实例,该重载采用实例工厂委托(即容器的实例工厂方法)。如果您不使用DI容器,则可以创建例如
MapperFactory
类,该类将负责映射器实例的创建及其配置

例如:

 var config = new MapperConfiguration(cfg =>
            {
                //cfg.CreateMap()...
                //cfg.AddProfile()... etc...
            });
var mapper = config.CreateMapper();

看不到初始化映射的位置

解决方案:

您可以创建映射配置文件,例如:

public class MappingProfile : Profile
{
    public MappingProfile()
    {
       CreateMap<Company, CompanyFormViewModel>()
          .ForMember(vm => vm.Id, map => map.MapFrom(m => m.Id))
          .ForMember(vm => vm.Name, map => map.MapFrom(m => m.Name))
          .ForMember(vm => vm.Owner, map => map.MapFrom(m => m.Owner))
          .ForMember(vm => vm.Email, map => map.MapFrom(m => m.Email))
          .ForMember(vm => vm.Password, map => map.MapFrom(m => m.Password))
          .ForMember(vm => vm.Address, map => map.MapFrom(m => m.Address));
       CreateMap<CompanyFormViewModel, Company>()
          .ForMember(m => m.Id, map => map.MapFrom(vm => vm.Id))
          .ForMember(m => m.Name, map => map.MapFrom(vm => vm.Name))
          .ForMember(m => m.Owner, map => map.MapFrom(vm => vm.Owner))
          .ForMember(m => m.Email, map => map.MapFrom(vm => vm.Email))
          .ForMember(m => m.Password, map => map.MapFrom(vm => vm.Password))
          .ForMember(m => m.Address, map => map.MapFrom(vm => vm.Address)); 

    }
}
最后,别忘了在
应用程序中配置自动映射器\u Start()


您可能正在使用旧版本的AutoMapper.Extensions.Microsoft.DependencyInjection
从NuGet和change services.AddAutoMapper()安装最新版本的AutoMapper.Extensions.Microsoft.DependencyInjection(我使用的是v7.0.0)到services.AddAutoMapper(typeof(services))在Startup.cs

IMapperConfigurationExpression中不包含CreateMapper()的定义而且没有扩展方法CreateMapper接受类型为IMapperConfigurationExpression的第一个参数。…@mac因为您没有显示它,我假设您的cfg对象类型是
MapperConfiguration
。但是,您需要实例化该类型的对象,在其中设置映射和配置文件,然后使用
CreateMapper
方法to get mapper instanceI在更改代码后,仍会遇到与您在中所述相同的错误example@mac请参阅,在这里您可以看到映射器初始化的两种方法(我向您展示的版本,以及使用静态方法时的版本)。我承认这是一个迟来的答案,我是Automapper的新手。之前也有同样的错误。我在寻找解决方案时找到了你的帖子。我也是新手,尽管我会尝试这样做,以避免编写定制映射类。如果我们必须手动配置每个属性,Automapper中的要点是什么?默认情况下它不能映射两个对象吗具有相同属性名称的ts?AutoMapper不是100%的魔法。它不会映射具有不同名称的对象。但它确实会在某些点上减少重复代码,这有助于应用DRY原则。感谢您回来。这一切都很好;如果所有属性名称都相同,我找到了如何正确设置它的方法,并在上述情况下按预期工作在这两个对象之间,您应该能够执行
CreateMap()
,并摆脱
ForMember
s。
//Configure Automapper
AutoMapperConfiguration.Configure();