我正在试图找出构建这个项目的最佳方法。基本上,它是一个“乐队”个人资料网站。我正在使用ASP.NET 4,EF和Automapper(结构图也是如此,但这并不重要)。我遇到了性能问题,需要就我的方法是否正确提出建议(我的猜测不是)。我将专注于特定部分并提供精简的示例。
我有一个EntityFramework存储库类,它使用LINQ直接与EF对象进行交互:
[Pluggable("Repository")]
public class EntityDataRepository : IRepository
{
static EntityDataRepository()
{
// other mappings removed
// Data. objects are EF objects, mapping to my DTO classes
Mapper.CreateMap<Data.Event, Models.EventModel>();
Mapper.CreateMap<Data.Genre, Models.GenreModel>();
Mapper.CreateMap<Data.Band, Models.BandModel>();
}
public IEnumerable<BandModel> GetBandsByUser(Guid userId)
{
using (var ctx = new DbContext())
{
var user = GetCurrentUserModel(ctx, userId);
var efBands = from r in user.BandRelations
orderby r.Date
select r.Band;
return Mapper.Map<IEnumerable<Data.Band>, IEnumerable<Models.BandModel>>(efBands);
}
}
}
乐队有流派和活动。请注意,它将EF对象映射到我的DTO对象,并返回它们的列表。它充当代理,使我的控制器能够调用方法来获取它所需的数据(实际逻辑被改变以显示我需要的东西):
namespace OpenGrooves.Web.Areas.Edit.Controllers
{
[Authorize]
public class MyBandsController : BaseController
{
public ActionResult ShowBands()
{
IEnumerable<BandModel> bands = repository.GetBandsByUser(loggedUserGuid).First();
return View(bands);
}
}
}
最后,这是BandModel类,它反映了EF中的Band类实体:
public class BandModel
{
// fluff and scalar properties removed
public IEnumerable<EventModel> Events { get; set; }
public IEnumerable<GenreModel> Genres { get; set; }
}
基本上,我这样做了吗?在我的EF到DTO类中,Band EF实体具有导航属性,例如Genres和Events。问题是,在自动播放器中进行的映射期间,正在填充这些列表属性,尤其是在我的一个代理方法返回BandModel列表时。它似乎正在为每条记录调用Genres和Event EF查询,这显然是一个主要的性能杀手(对于返回的每个BandModel对象,至少运行2个事件和类型查询)。
谢谢!
答案 0 :(得分:2)
可以直接在我的控制器中使用EF对象,甚至可以用作视图模型吗?
是的,有点。
这个答案是主观的,取决于你如何看待你关注的分离。包括我在内的大多数MVC开发者都对视图模型发誓。它将您的数据或域类与表示层分离。这太棒了。
有些人不喜欢很棒,包括其他语言和框架,比如每个PHP MVC框架,Rails和Django。没有人能说这些语言“做错了”但我们.NET开发者订阅了不同的范例。
在你说延迟加载发生之后,你说第二个问题很奇怪你说“有什么东西可以启用延迟加载”。小心解释一下?
在EF4中默认启用延迟加载。