对我的ASP.NET MVC,EF层和项目的Automapper设置的建议

时间:2011-01-17 02:19:03

标签: c# asp.net asp.net-mvc entity-framework dto

我正在试图找出构建这个项目的最佳方法。基本上,它是一个“乐队”个人资料网站。我正在使用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个事件和类型查询)。

  • 可以直接在我的控制器中使用EF对象,甚至可以用作视图模型吗?
  • 我的映射中是否需要更改某些内容以启用对这些导航属性(事件,BandModel对象下的流派)的延迟加载?

谢谢!

1 个答案:

答案 0 :(得分:2)

可以直接在我的控制器中使用EF对象,甚至可以用作视图模型吗?

是的,有点。

这个答案是主观的,取决于你如何看待你关注的分离。包括我在内的大多数MVC开发者都对视图模型发誓。它将您的数据或域类与表示层分离。这太棒了。

有些人不喜欢很棒,包括其他语言和框架,比如每个PHP MVC框架,Rails和Django。没有人能说这些语言“做错了”但我们.NET开发者订阅了不同的范例。


在你说延迟加载发生之后,你说第二个问题很奇怪你说“有什么东西可以启用延迟加载”。小心解释一下?

在EF4中默认启用延迟加载。