Entity framework MVC2、实体框架和;存储库模式
我正试图获得一个使用MVC2和EF的存储库模式。 我的问题是在混凝土存储库中。当我尝试将EF查询结果强制转换为视图模型实体的IEnumerable集合时: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
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
属性。