【问题标题】:MVC2, Entity Framework, & repository patternMVC2、实体框架和存储库模式
【发布时间】:2011-04-10 11:49:56
【问题描述】:

我正在尝试让存储库模式与 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());
    }

}

【问题讨论】:

    标签: entity-framework asp.net-mvc-2 repository-pattern


    【解决方案1】:

    您正在尝试将MediaReleases 的集合转换为MediaReleaseModels 的集合。如果MediaReleaseModel 是一个单独的类,则不能仅通过强制转换来完成。一般只有在一个继承链或定义conversion operators时,cast才会成功,这里不是这样。

    您需要在这里将MediaRelease 字段重写为您的模型对象(可以使用AutoMapper 等工具自动化),即借助LINQ:

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

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

    【讨论】:

    • 谢谢。回复:您的最后一行:您指的是 MediaReleaseRepository 中的 linq 语句,对吗? (不在控制器构造函数中调用存储库?)
    • 是的。通常,构造函数应该只收集依赖项,避免做“真正的工作”。您的查询可以轻松移动到MediaReleases 属性。
    猜你喜欢
    • 2010-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多