当数据源为azure db(免费版本)时,从Domain模型到视图模型的转换很慢

时间:2018-08-28 07:12:51

标签: c# entity-framework azure

我有一个包含多个相关表的域类Case

public class Case
{
    public int CaseId { get; set; }
    public string Name { get; set; }
    public DateTime StartDateTime { get; set; }
    public DateTime? EndDateTime { get; set; }
    public virtual ICollection<CaseUser> CaseUsers { get; set; }
    public virtual ICollection<Sector> Sectors { get; set; }
    public virtual ICollection<CasePoaSerie> CasePoaSeries { get; set; }
    public virtual ICollection<Pod> Pods { get; set; }
    public virtual ICollection<Poa> Poas { get; set; }

    public Case()
    {
        CaseUsers = new Collection<CaseUser>();
        Sectors = new Collection<Sector>();
        CasePoaSeries = new Collection<CasePoaSerie>();
        Pods = new Collection<Pod>();
        Poas = new Collection<Poa>();
    }
}

考虑该表有3行数据,我的存储库方法返回所有这3行,并带有所有其他相关表(CaseUsers,Sectors,CasePoaSeries,Pods,Poas)的值。我在服务客户端类中将此域模型转换为视图模型。

我的翻译代码

public static class CaseTranslator
{
    public static Case UpdateToDomain(Models.Case modalcase)
    {
        var domaincase = new Case()
        {
            CaseId = modalcase.CaseId,
            EndDateTime = modalcase.EndDateTime,
            Name = modalcase.Name,
            StartDateTime = modalcase.StartDateTime,
        };

        modalcase.CaseUsers.ForEach(x => domaincase.CaseUsers.Add(CaseUserTranslator.UpdateToDomain(x)));
        modalcase.CasePoaSeries.ForEach(x => domaincase.CasePoaSeries.Add(CasePoaSeriesTranslator.UpdateToDomain(x)));
        modalcase.Sectors.ForEach(x => domaincase.Sectors.Add(SectorTranslator.UpdateToDomain(x)));
        modalcase.Poas.ForEach(x => domaincase.Poas.Add(PoasTranslator.UpdateToDomain(x)));

        return domaincase;
    }

    public static Models.Case UpdateToModel(Case domaincase)
    {
        if (domaincase == null)
        {
            return null;
        }
        var modalcase = new Models.Case()
        {
            CaseId = domaincase.CaseId,
            EndDateTime = domaincase.EndDateTime,
            Name = domaincase.Name,
            StartDateTime = domaincase.StartDateTime,
        };


        domaincase.CaseUsers.ForEach(x=> modalcase.CaseUsers.Add(CaseUserTranslator.UpdateToModel(x)));
        domaincase.Poas.ForEach(x => modalcase.Poas.Add(PoasTranslator.UpdateToModel(x)));
        domaincase.Pods.ForEach(x => modalcase.Pods.Add(PodsTranslator.UpdateToModel(x)));
        domaincase.CasePoaSeries.ForEach(x => modalcase.CasePoaSeries.Add(CasePoaSeriesTranslator.UpdateToModel(x)));
        domaincase.Sectors.ForEach(x => modalcase.Sectors.Add(SectorTranslator.UpdateToModel(x)));
        return modalcase;
    }
}

每个翻译器遵循相同的模式。

我的ServiceClient代码

public List<Case> GetCasesByUserId(int userId)
    {
        var activeCases = new List<Case>();
        var cases = _caseRepository.GetActiveCasesForUser(userId);
        cases.ForEach(o=> activeCases.Add(CaseTranslator.UpdateToModel(o)));
        return activeCases;
    }

我的问题 当我使用LocalDb作为数据源时,我的方法非常快,请参见以下屏幕截图。

localdb中的数据大约需要124毫秒检索数据。 localdb data retrieval

我的系统大约需要392毫秒翻译这些数据。 localdb data translation

现在,如果我将数据源更改为azure db,则大约需要花费时间。 1,069毫秒从数据库检索数据。

azuredb data retrieval

我的系统大约需要2,62,604毫秒转换从azuredb检索到的这些数据。 azuredb data translation

我们可以清楚地看到,转换器处理相同数量的数据需要花费更多的时间(几乎无法接受的延迟),如果从localdb进行转换,则转换速度非常快。

我现在很困惑,因为我不知道真正的问题是什么。

我的翻译器代码有问题吗?还是造成延迟的原因是azure数据库?

附加信息我在Manuel迁移中使用的是实体框架代码优先方法。我使用的azure数据库是免费计划。

天青计划 我们正在使用共享平面,网站在免费计划的azure服务器中运行,而应用程序数据库在标准计划的azure服务器中运行。

1 个答案:

答案 0 :(得分:0)

我已经解决了这个问题,代码没有问题,所有问题都归因于网站的托管。

正如我提到的,当我们以Azure免费计划托管站点时,与localhost相比,该站点非常慢。当我们升级托管站点的计划时,该站点变得很快。

结论:如果将Web客户端托管在Azure免费计划中,则会导致性能下降。将天蓝色的计划升级到更高版本将帮助您实现网站的真实速度。