【问题标题】:Why am I getting a Missing type map configuration error?为什么我会收到缺少类型映射配置错误?
【发布时间】:2023-04-10 15:16:02
【问题描述】:

我已经修改了这个 ContosoUniversity 教程:http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/creating-an-entity-framework-data-model-for-an-asp-net-mvc-application,现在我正在尝试使用 AutoMapper 来映射对象到对象。

这是我的模型视图:

public class InstructorIndexData
{
    public IEnumerable<Instructor> Instructors { get; set; }
    public IEnumerable<Course> Courses { get; set; }
    public IEnumerable<Enrollment> Enrollments { get; set; }
    public IEnumerable<Student> Students { get; set; }
    public IEnumerable<Assignment> Assignments { get; set; }
}

这是风景

@model SchoolIn.ViewModels.InstructorIndexData

@using SchoolIn.Models
@{ViewBag.Title = "Index";}


@using (Html.BeginForm("ClassAttendance", "Attendance", 
    new { currentDate = day, id = @ViewBag.ID, 
        teacher = HttpContext.Current.Session["sTeacher"], 
        courseID = HttpContext.Current.Session["sCourseID"] }, FormMethod.Post))

{
    var wekdys = new Enrollment(); @*had too create this to have access to the dropdownList*@
    @Html.DropDownList("weekDays", wekdys.WeekDays.Select(s => 
        new SelectListItem { Text = s.ToString(), Value = s.ToString() }))

    @Html.ValidationSummary(true)
    <p></p>
    <Input Type ="submit" Value="ClassAttendance"/>
    <p>@Html.ActionLink("Create Todays Attendance", "Create")</p>
    <p>@Html.ActionLink("Create New", "Create")</p>
    <h3>Students Enrolled in @ViewBag.teacherName's @ViewBag.courseTitle Course</h3>  
    <table>  
        <tr>  
            <th>View Student Report</th> 
            <th>First Name</th>  
            <th>Last Name</th> 
            <th>Grade</th>  
            <th>Attendance Code</th>  
            <th>Class Day</th> 
        </tr>  
        @foreach (var item in Model.Enrollments)
        {  
        <tr>  
            <td>  
                @Html.ActionLink("Report", "UpdateAttendance", "Attendance", 
                    new { 
                        grade=item.Grade, 
                        studentFirstName = item.Student.FirstMidName, 
                        studentLastName = item.Student.LastName, 
                        courseTitle = item.Course.Title, 
                        teacher = @ViewBag.teacherName }, null)
            </td> 
            <td>@Html.EditorFor(modelItem=>item.Student.FirstMidName)</td>  
            <td>@Html.EditorFor(modelItem=>item.Student.LastName)</td> 
            <td>@Html.EditorFor(modelItem =>item.Grade)</td>
            <td>@Html.DropDownList("attendanceCode", item.attendanceCode.Select(s => 
                 new SelectListItem { Text = s.ToString(), Value = s.ToString() }))
                @*Html.EditorFor(modelItem =>item.attendanceCode)*/*@
            </td>  
            <td>@Html.EditorFor(modelItem=>item.classDays)</td>
        </tr>  
        }  
    </table>  
}

这是我在控制器中遇到问题的方法。我正在尝试使用这个例子:http://chriscurrie.co.uk/blog/2011/09/coding/net/mvc/use-automapper-to-map-viewmodels-to-entities-mvc3-and-razor/

public class AttendanceController : Controller
{
    private SchoolInDB db = new SchoolInDB();
}

代码在这里...

[HttpPost]
public ActionResult ClassAttendance(InstructorIndexData viewModel)
{


    if (ModelState.IsValid)
    {

        AutoMapper.Mapper.CreateMap<AttendanceData, Assignment>();
        AutoMapper.Mapper.CreateMap<AttendanceData, Enrollment>();
        AutoMapper.Mapper.CreateMap<AttendanceData, Student>();
        AutoMapper.Mapper.CreateMap<AttendanceData, Instructor>();

        Instructor newInstructor = new Instructor();
        Student newStudent = new Student();
        Assignment newAssignment = new Assignment();
        Enrollment newEnrollment = new Enrollment();

        AutoMapper.Mapper.Map(viewModel, newInstructor );
        AutoMapper.Mapper.Map(viewModel, newStudent);
        AutoMapper.Mapper.Map(viewModel, newEnrollment);
        AutoMapper.Mapper.Map(viewModel, newAssignment);

        db.Assignments.AddObject(newAssignment).;

        db.SaveChanges();
        return RedirectToAction("Index");
    }

    return View();
}

当我调试我的代码时,这里会出现以下错误:“AutoMapper.Mapper.Map(viewModel, newInstructor);”: 缺少类型映射配置或不支持的映射。

映射类型: InstructorIndexData -> 讲师 SchoolIn.ViewModels.InstructorIndexData -> SchoolIn.Models.Instructor

目标路径: 导师

来源价值: SchoolIn.ViewModels.InstructorIndexData

我还注意到,在我的 ActionResult(InstructorIndexData viewModel) 中,viewModel 具有所有空值。

【问题讨论】:

  • viewModel 字段的类型是什么?

标签: asp.net-mvc automapper


【解决方案1】:

据我了解,viewModel 的类型是 InstructorIndexData。如果是这样,则需要添加配置:

    AutoMapper.Mapper.CreateMap<InstructorIndexData, Assignment>();
    AutoMapper.Mapper.CreateMap<InstructorIndexData, Enrollment>();
    AutoMapper.Mapper.CreateMap<InstructorIndexData, Student>();
    AutoMapper.Mapper.CreateMap<InstructorIndexData, Instructor>();

【讨论】:

  • 谢谢我已经更改了 CreateMap 现在代码在 db.SaveChanges() 处停止并显示错误消息 Datetime2 数据类型到 datetime 数据类型的转换导致超出-范围值。该语句已终止。这可能是因为 ViewModel 在这里 'ActionResult(InstructorIndexData viewModel' 有空值吗?
  • 是“datetime2 数据类型到日期时间”的拼写错误还是你真的有 datetime2 类型?
  • 此问题与 AutoMapper 无关。我建议您提出单独的问题。无论如何,这里有几个关于这个主题的链接:stackoverflow.com/questions/1678474/…stackoverflow.com/questions/4608734/…
  • 这不是一个错字...我在我的视图中使用的是 datetime 但不是 datetime2
  • DateTime 映射到数据库中的 datetime2。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多