asp.net / EntityFramework-为什么我的应用程序池崩溃?

时间:2018-08-10 12:38:09

标签: c# mysql entity-framework linq iis

我正在尝试向API添加新方法。

该方法的目标是返回在预置位中具有给定Partenaires的{​​{1}}列表。

当我通过GET请求调用该方法时,我的API的应用程序池崩溃。在事件日志中,我有一个名为Microsoft-Windows-WAS的警告,并且链接的错误是:

  

为应用程序池“ UphairApi2”提供服务的进程与Windows Process Activation Service发生致命的通信错误。进程ID为“ 3960”。数据字段包含错误号。

网络开发人员工具说它无法加载响应数据。

  

无法加载响应数据

当我返回Prestation时,这是返回的请求:

  

“ SELECT \ r \ n return db.Partenaires.Where(p => p.PartenairePrestations.Any(pp => pp.Prestation.NomPrestation == prestation.Value)).ToString();Extent1,\ r \ n IdPartenaireExtent1,\ r \ n FirstName。{{1 }},\ r \ n Extent1LastName,\ r \ n Extent1Email,\ r \ n Extent1Password ,\ r \ n Extent1PasswordSalt,\ r \ n Extent1Type,\ r \ n Extent1Pays,\ r \ n Extent1Ville,\ r \ n Extent1CodePostale,\ r \ n Extent1Adresse,\ r \ n Extent1Lat,\ r \ n Extent1Lng,\ r \ n Extent1ImageUrl,\ r \ n { {1}}。Extent1,\ r \ n CouvertureUrlExtent1,\ r \ n DateNaissanceExtent1,\ r \ n {{1 }}。ADomicile,\ r \ n Extent1SeDeplace,\ r \ n Extent1DateAjout,\ r \ n Extent1AdresseComplement,\ r \ n Extent1TelMobile,\ r \ n Extent1ValidationAutomatique,\ r \ n Extent1。{ {1}},\ r \ n NotifEmailMessageExtent1,\ r \ n NotifEmailReservationExtent1,\ r \ n NotifEmailPaiement。{{1 }},\ r \ n Extent1NotifEmailNewsletter,\ r \ n Extent1NotifSmsMessage,\ r \ n Extent1NotifSmsReservation ,\ r \ n Extent1IdUserMango,\ r \ n Extent1Iban,\ r \ n Extent1TitulaireCompte,\ r \ n Extent1IdWallet,\ r \ n Extent1IdAccount,\ r \ n Extent1Valide \ r \ nFROM Extent1 AS Son \ r \ n存在(SELECT \ r \ n1 AS Extent1 \ r \ nFROM Push AS Extent1内部联接{{1} }在IdPhonePartenaireExtent1 = C1PartenairePrestation \ r \ n哪里(Extent2Prestation = { {1}}。Extent3)和(({Extent2IdPrestation = @ p__linq__0)或(({Extent3IdPrestation is NULL)AND(@ p__linq__0 IS NULL)))))“

以及Mysql Workbench的等效项:

  

选择Extent1.IdPartenaire,Extent1.FirstName,Extent1.LastName,Extent1.Email,Extent1.Password,Extent1.PasswordSalt,Extent1.Type,Extent1.Pays,Extent1.Ville,Extent1.CodePostale,Extent1.Adresse,Extent1。 Lat,Extent1.Lng,Extent1.ImageUrl,Extent1.CouvertureUrl,Extent1.DateNaissance,Extent1.ADomicile,Extent1.SeDeplace,Extent1.DateAjout,Extent1.AdresseComplement,Extent1.TelMobile,Extent1.ValidationAutomatifE。 Extent1.NotifEmailPaiement,Extent1.NotifEmailNewsletter,Extent1.NotifSmsMessage,Extent1.NotifSmsReservation,Extent1.IdUserMango,Extent1.Iban,Extent1.TitulaireCompte,Extent1.IdWallet,Extent1.IdAccount,Extent1.ValideP。来自Partenaire AS Extent1的IDPhone存在(从PartenairePrestation AS Extent2内联接中选择1 AS C1在Extent2.IdPrestation = Extent3.IdPrestation WHERE(Extent1.IdPartenaire = Extent2.IdPartenaire)和(((Extent3.NomPres tation ='Barbe')))

我在MysqlWorkbench中测试了此请求,并且很好地返回了一组数据。

这是我的方法:

Extent1

我在做什么错了?

任何帮助将不胜感激,因为我在互联网上找不到其他相关主题。

1 个答案:

答案 0 :(得分:0)

您可能需要调试API并指定更多详细信息以帮助缩小原因。我可以看到几件事:

var prestation = queryString.FirstOrDefault();
// Handle when prestation comes back #null. Is that valid?

var results = db.Partenaires.Where(p => p.PartenairePrestations.Any(pp => pp.Prestation.NomPrestation == prestation.Value))
//                .ToList() // Avoid .ToList() here... Select the entity properties you need.
    .Select(p => new PartenaireMapItem {
        IdPartenaire = p.IdPartenaire,
        FirstName = p.FirstName,
        LastName = p.LastName,
        // NomComplet = p.LastName.Substring(0,1).ToUpper() + ". " + p.FirstName, // Remove. Make this a computed property in your view model.
        Type = p.Type,
        // DureeMin = 50, // Can remove, can be a computed property.
        Lat = p.Lat,
        Lng = p.Lng,
        ImageUrl = p.ImageUrl,
        SeDeplace = p.SeDeplace, // Ok if a String/value. 
        ADomicile = p.ADomicile, // Ok if a String/value.

        Notes = p.NoteClientPartenaires, // Ok if a String/value.
        Prestations = p.PartenairePrestations.Select(y => y.Prestation.NomPrestation).ToList(); // Assuming this is retrieving the names of presentations. List<string>.
    }).ToList();

return results;

早期的.ToList()是必需的,因为您试图在Linq表达式中计算值(NameComplet),这些值通常会被馈送到数据库提供者无法理解的EF。为了提高效率,请仅选择映射的属性,然后将所有计算值更改为视图模型上的只读属性。 (PartenaireMapItem)

private string _nomComplet = null;
public string NomComplet
{ 
    get { return _nomComplet ?? (_nomComplet = LastName.Substring(0,1).ToUpper() + ". " + FirstName); }
}

该示例在假定名称详细信息为只读的情况下缓冲了结果。如果可以更新名字/姓氏,则每次只需返回计算出的名字即可。

假定SeDeclace / ADomicile是字符串值而不是子实体,则其他属性应该很好。 Prestations列表也是如此。可以使用Prestation名称的字符串列表。

我做的另一个较小更改是在返回变量之前检索视图模型以进行检查。这样可以更好地方便使用断点在返回之前检查结果。从这里确定结果计算是否返回了任何错误,或者诸如将结果视图模型序列化回客户端之类的其他信息。