Как решить ошибку преобразования типов в ASP.NET C #?

#c# #entity-framework

#c# #entity-framework

Вопрос:

Вот моя модель

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ComponentModel.DataAnnotations;

namespace TheFoody.Models
{
    public class ManageViewModel
    {
        public string FirstName { get; set; }

        public string LastName { get; set; }

        public string Email { get; set; }

        public string Phone { get; set; }

        public string Photo { get; set; }

        public string Address { get; set; }

        public string City { get; set; }

        public int PostCode { get; set; }

        public string District { get; set; }

        public string UserType { get; set; }

        public string Status { get; set; }
    }
}
  

Вот мой контекст

     namespace TheFoody.DataAccess
{
    using System;
    using System.Data.Entity;
    using System.Data.Entity.Infrastructure;

    public partial class TheFoodyContext : DbContext
    {
        public TheFoodyContext()
            : base("name=TheFoodyContext")
        {
        }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            throw new UnintentionalCodeFirstException();
        }

        public virtual DbSet<Menu> Menus { get; set; }
        public virtual DbSet<User> Users { get; set; }
        public virtual DbSet<Category> Categories { get; set; }
        public virtual DbSet<Restaurant> Restaurants { get; set; }
        public virtual DbSet<Restaurant_Type> Restaurant_Type { get; set; }
    }
}
  

Вот мой контроллер

  using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using TheFoody.DataAccess;
using TheFoody.Models;

namespace TheFoody.Controllers
{
    public class ManageController : Controller
    {
        public ActionResult Manage()
        {
            return View();
        }

        [HttpPost]
        public ActionResult Manage(ManageViewModel manageviewmodel)
        {
            TheFoodyContext db = new TheFoodyContext();
            ManageViewModel user_to_update = db.Users.SingleOrDefault(s => s.email == manageviewmodel.Email);

            return View(manageviewmodel);
        }
    }
}
  

Но здесь, когда я пытаюсь закодировать эту часть «ManageViewModel user_to_update = db.Users.SingleOrDefault(s => s.email == manageviewmodel.Электронная почта);» Это выдаст мне выделенную ошибку под названием «Не удается неявно преобразовать тип ‘TheFoody.Доступ к данным.Пользователь «в «TheFoody.Модели.ManageViewModel'»

Я очень новичок в этой среде, и я не знаю, почему эта ошибка возникает подобным образом.

Комментарии:

1. Вы не можете назначить тип ‘User’ типу ‘ManageViewModel’

2. Можете ли вы показать нам определение «Пользователь»?

3. Вы должны создать функцию для извлечения виртуальной машины для заданной модели данных.

Ответ №1:

db.Users является DbSet<TheFoody.DataAccess.User> , и SingleOrDefault() возвращает одного такого пользователя или null, если пользователь не был найден по этому адресу электронной почты.

Экземпляр этого класса не может быть неявно преобразован в запрошенный ManageViewModel , вам необходимо сопоставить его:

 DataAccess.User user = db.Users.SingleOrDefault(...);
if (user == null)
{
    // show error page telling that the POSTed email address is not known
}

ManageViewModel user_to_update = new ManageViewModel 
{
    FirstName = user.FirstName,
    LastName = user.LastName,
    // ...
}
return View(user_to_update);
  

Вы можете использовать AutoMapper для выполнения сопоставления более удобным способом.

Хотя кажется, что вы хотите обновить базу данных моделью, отправленной через POST, тогда вам нужно изменить логику: вам нужно назначить user свойства из полученной manageviewmodel :

 // read from database
DataAccess.User user = db.Users.SingleOrDefault(...);

if (user == null)
{
    // show error page telling that the POSTed email address is not known
}

// update from POST
user.FirstName = manageviewmodel.FirstName;
user.LastName = manageviewmodel.LastName;
// ...

// persist to database
db.SaveChanges();
  

Комментарии:

1. Это приведет к сбою, если возвращаемое значение ‘User’ равно null!

Ответ №2:

Это потому, что вы не можете напрямую привести тип пользователя к ManageViewModel

Вы можете устранить проблему, присвоив результат запроса типу User, а затем выполнить итерацию свойств типа User и присвоить их соответствующему свойству типа ManageViewModel.

Пример:

 User user_to_update = db.Users.SingleOrDefault(s => s.email == manageviewmodel.Email);

    if (user != null)
    {
        var manageViewModel = new ManageViewModel()

        manageViewModel.FirstName = user.FirstName;
        manageViewModel.LastName = user.LastName;
    }
    else {
     //Manage null exception here
    }
  

…И так далее