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