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 }); 
} 

回答

1

這個問題不從ObjectSet<T>轉換爲IEnumerable<T>ObjectSet<T> implements IEnumerable<T>)。

問題是從TestSolution.Project轉換爲TestSolution.Models.ProjectModel。您將需要編寫一些代碼的轉換,或許真的類似於下面:

model.Select(i => new ProjectModel() { /* Set properties here. */ }); 
+2

'AutoMapper'將是一個資產,這個項目發出的聲音就像... –

+0

同意。以下是該項目的鏈接:http://automapper.codeplex.com/ –

+0

謝謝,夥計們。我會看看某種轉換,以及AutoMapper。我從來沒有使用AutoMapper,但我會看看它。但是,我想知道,Automapper是唯一的方法嗎?爲了充分利用MVC3和EF 4.1的開箱即用功能,我對轉換邏輯有點驚訝。我以爲我只是在做錯事,而不是我錯過了一個插件。 – campbelt

相關問題