2
我正在构建一个使用MVC3,Razor和Entity Framework 4.1的测试应用程序,并采用模式优先方法(与代码优先方法相同),以存储库模式。我想避免在我的视图中访问数据对象,而是访问模型,但我遇到了问题。据我所知,数据对象正在从数据层返回ObjectSet,但我的视图需要IEnumerable,我不知道如何将其转换为另一个。如何将ObjectSet从实体转换为IEnumerable模型?
下面是一些代码,以帮助澄清。
型号...
namespace TestSolution.Models
{
public class ProjectModel
{
[HiddenInput]
public int Id { get; set; }
[Required]
[StringLength(255, ErrorMessage = "The name cannot be more than 255 characters long.")]
[Display(Name = "Name")]
public string Name { get; set; }
[Required]
[Display(Name = "Description")]
public string Description { get; set; }
}
}
库...
public IQueryable<ProjectModel> GetProjects()
{
return Db.Project;
}
实体...
public ObjectSet<Project> Project
{
get
{
if ((_Project == null))
{
_Project = base.CreateObjectSet<Project>("Project");
}
return _Project;
}
}
控制器...
public ActionResult Index()
{
IEnumerable<TestSolution.Models.ProjectModel> model = _projectRepository.GetProjects();
return View(model);
}
查看...
@model IEnumerable<TestSolution.Models.ProjectModel>
错误时,建设我得到...
Cannot implicitly convert type 'System.Data.Objects.ObjectSet<TestSolution.Project>' to 'System.Linq.IQueryable<TestSolution.Models.ProjectModel>'. An explicit conversion exists (are you missing a cast?)
这个问题有意义吗?我只是不确定从哪里出发...任何建议你们可以给我会很棒。 :)
编辑:我能够改变我的仓库代码与凯尔的建议来解决这个...
public IQueryable<ProjectModel> GetProjects()
{
return Db.Project.Select(i => new ProjectModel() { Id = i.Id, Name = i.Name, Description = i.Description });
}
'AutoMapper'将是一个资产,这个项目发出的声音就像... –
同意。以下是该项目的链接:http://automapper.codeplex.com/ –
谢谢,伙计们。我会看看某种转换,以及AutoMapper。我从来没有使用AutoMapper,但我会看看它。但是,我想知道,Automapper是唯一的方法吗?为了充分利用MVC3和EF 4.1的开箱即用功能,我对转换逻辑有点惊讶。我以为我只是在做错事,而不是我错过了一个插件。 – campbelt