#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
}
…И так далее