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

相关问题