Entity framework MVC2、实体框架和;存储库模式

Entity framework MVC2、实体框架和;存储库模式,entity-framework,asp.net-mvc-2,repository-pattern,Entity Framework,Asp.net Mvc 2,Repository Pattern,我正试图获得一个使用MVC2和EF的存储库模式。 我的问题是在混凝土存储库中。当我尝试将EF查询结果强制转换为视图模型实体的IEnumerable集合时: Unable to cast object of type 'System.Data.Objects.ObjectQuery`1[Data_Service.MediaReleases]' to type 'System.Collections.Generic.IEnumerable`1[TestMVCWithFacory

我正试图获得一个使用MVC2和EF的存储库模式。 我的问题是在混凝土存储库中。当我尝试将EF查询结果强制转换为视图模型实体的IEnumerable集合时:

Unable to cast object of type     
'System.Data.Objects.ObjectQuery`1[Data_Service.MediaReleases]' 
to type 
    'System.Collections.Generic.IEnumerable`1[TestMVCWithFacory.Models.Entities.MediaReleaseModel]'.
我觉得这是一件很难做到的事情——这是Linq的事情,也是延迟执行的工作原理,但我真的不理解伏都教

那么,我在这里误解了什么,我该如何应对呢

视图模型:

public class MediaReleaseModel
{
    public string Headline { get; set; }
    public string FullText { get; set; }
}
public interface IMediaReleasesRepository
{
    IEnumerable<MediaReleaseModel> MediaReleases { get;}
}
public class MediaReleaseRepository : IMediaReleasesRepository
{
    private NewsEntities DataContext = new NewsEntities();
    private IEnumerable<MediaReleases> _MRs;

    public MediaReleaseRepository()
    {
        _MRs = from art in DataContext.MediaReleases select art;
    }

    public IEnumerable<MediaReleaseModel> MediaReleases
    {
        get { return (IEnumerable<MediaReleaseModel>)_MRs; }
    }

}
public class HomeController : Controller
{
    private IMediaReleasesRepository _MRRepository;
    public HomeController()
    {
        _MRRepository= new MediaReleaseRepository();
    }

    public ViewResult index()
    {
        return View(_MRRepository.MediaReleases.ToList());
    }

}
存储库界面:

public class MediaReleaseModel
{
    public string Headline { get; set; }
    public string FullText { get; set; }
}
public interface IMediaReleasesRepository
{
    IEnumerable<MediaReleaseModel> MediaReleases { get;}
}
public class MediaReleaseRepository : IMediaReleasesRepository
{
    private NewsEntities DataContext = new NewsEntities();
    private IEnumerable<MediaReleases> _MRs;

    public MediaReleaseRepository()
    {
        _MRs = from art in DataContext.MediaReleases select art;
    }

    public IEnumerable<MediaReleaseModel> MediaReleases
    {
        get { return (IEnumerable<MediaReleaseModel>)_MRs; }
    }

}
public class HomeController : Controller
{
    private IMediaReleasesRepository _MRRepository;
    public HomeController()
    {
        _MRRepository= new MediaReleaseRepository();
    }

    public ViewResult index()
    {
        return View(_MRRepository.MediaReleases.ToList());
    }

}

您正在尝试将
MediaRelease
s的集合强制转换为
MediaReleaseModel
s的集合。如果
MediaReleaseModel
是一个单独的类,那么这不能通过强制转换来完成。一般来说,cast只会在一个继承链中成功,或者在定义继承链时成功,但这里的情况并非如此

这里您需要的是将
MediaRelease
字段重写到您的模型对象(可以使用以下工具实现自动化),即在LINQ的帮助下:

public IEnumerable<MediaReleaseModel> MediaReleases
{
    get
    {
        return _MRs.Select(x => new MediaReleaseModel() 
        {
            Prop1 = x.Prop1 
            /* etc. */
        });
    }
}
public IEnumerable MediaReleases
{
得到
{
return _MRs.Select(x=>newMediaReleaseModel()
{
Prop1=x.Prop1
/*等等*/
});
}
}

另一个建议是:最好不要在构造函数中使用这样的逻辑,创建对象应该是一种廉价的操作,而且在真正需要数据之前获取数据时会有点奇怪。

谢谢。回复:最后一行:您指的是MediaReleaseRepository中的linq语句,对吗?(没有在控制器构造函数中调用存储库?)是。通常,构造函数应该只收集依赖项,而避免做“实际工作”。您的查询可以轻松地移动到
MediaReleases
属性。