代码之家  ›  专栏  ›  技术社区  ›  Pierrick Martellière

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

  •  -2
  • Pierrick Martellière  · 技术社区  · 7 年前

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

    该方法的目标是返回 Partenaires 拥有给予的 Prestation 在他们的供词中。

    为应用程序池“UphairApi2”提供服务的进程与Windows进程激活服务发生严重通信错误。进程id为“3960”。数据字段包含错误号。

    未能加载响应数据

    当我回来的时候 return db.Partenaires.Where(p => p.PartenairePrestations.Any(pp => pp.Prestation.NomPrestation == prestation.Value)).ToString(); ,以下是返回的请求:

    “”选择\r\n“ Extent1 . IdPartenaire ,\r\n 延伸1 . FirstName ,\r\n . LastName ,\r\n 延伸1 . Email ,\r\n . Password 延伸1 . PasswordSalt ,\r\n 延伸1 Type ,\r\n 延伸1 . Pays ,\r\n 延伸1 . Ville 延伸1 . CodePostale 延伸1 . Adresse ,\r\n 延伸1 . Lat ,\r\n 延伸1 . Lng ,\r\n 延伸1 . ImageUrl ,\r\n 延伸1 . CouvertureUrl ,\r\n 延伸1 . DateNaissance ,\r\n 延伸1 . ADomicile ,\r\n 延伸1 SeDeplace ,\r\n 延伸1 . DateAjout 延伸1 . AdresseComplement ,\r\n 延伸1 . TelMobile ,\r\n 延伸1 . ValidationAutomatique ,\r\n 延伸1 NotifEmailMessage ,\r\n . NotifEmailReservation ,\r\n 延伸1 . NotifEmailPaiement ,\r\n 延伸1 . NotifEmailNewsletter ,\r\n . NotifSmsMessage ,\r\n 延伸1 . NotifSmsReservation 延伸1 IdUserMango ,\r\n 延伸1 . Iban ,\r\n 延伸1 TitulaireCompte ,\r\n 延伸1 . IdWallet ,\r\n 延伸1 . IdAccount ,\r\n 延伸1 . Valide ,\r\n 延伸1 . Son ,\r\n 延伸1 . Push ,\r\n 延伸1 . IdPhone \r\n从 Partenaire 作为 延伸1 \r\n存在的位置(选择\r\n1作为 C1 \r\n从 PartenairePrestation 作为 Extent2 给付 作为 Extent3 打开 延伸2 . IdPrestation 延伸3 IDP造林 \r\n哪里( 延伸1 . IdPartenaire公司 = 延伸2 IdPartenaire公司 )以及(( 延伸3 . NomPrestation =@p廑linq_u0)或(( . 为空)并且(@púu linqú0为NULL)))“

    以及Mysql Workbench的等效功能:

    extensat1,extensat1.extensat1,extensat1.extenset1,extensat1.extenset1,extensat1.extenset1,extensat1.extenset1,extensat1.extenset1,extensat1.extenset1,Extent1.adresesscompletion,Extent1.TelMobile,Extent1.ValidationAutomatique,Extent1.NotifEmailMessage,Extent1.NotifEmailReservation,Extent1.NotifEmailNewsletter,Extent1.notifsmsmmessage,Extent1.IdUserMango,Extent1.Iban,Extent1.titulairempte,Extent1.IdWallet,Extent1.id账户,Extent1.Valide,Extent1.Son,Extent1.Push,Extent1.IdPhone FROM Partenaire AS Extent1 WHERE existing(从Partenaire中选择1作为C1作为Extent2.IdPrestation作为Extent2.IdPrestation上的Extent3.IdPrestation=Extent3.IdPrestation,其中(Extent1.IdPartenaire=Extent2.IdPartenaire)和((Extent3.NomPrestation='Barbe'))

    我在MysqlWorkbench中测试了这个请求,返回了一组数据。

    // GET: api/Partenaires_prestations
            [Authorize]
            [Route("api/Partenaires_prestations")]
            public List<PartenaireMapItem> GetPartenairesWithPrestations() {
    
                Random rnd = new Random();
    
                var queryString = Request.GetQueryNameValuePairs();
    
                var prestation = queryString.FirstOrDefault();
    
                return db.Partenaires.Where(p => p.PartenairePrestations.Any(pp => pp.Prestation.NomPrestation == prestation.Value))
                    .ToList()
                    .Select(p => new PartenaireMapItem {
                        IdPartenaire = p.IdPartenaire,
                        FirstName = p.FirstName,
                        LastName = p.LastName,
                        NomComplet = p.LastName.Substring(0,1).ToUpper() + ". " + p.FirstName,
                        Type = p.Type,
                        DureeMin = 50,
                        Lat = p.Lat,
                        Lng = p.Lng,
                        ImageUrl = p.ImageUrl,
                        SeDeplace = p.SeDeplace,
                        ADomicile = p.ADomicile,
    
                        Notes = p.NoteClientPartenaires,
                        Prestations = p.PartenairePrestations.Select(y => y.Prestation.NomPrestation).ToList();
                    }).ToList();
    }
    

    我做错什么了?

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

    1 回复  |  直到 7 年前
        1
  •  0
  •   Steve Py    7 年前

    您可能需要调试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;
    

    需要early.ToList(),因为您正在尝试计算Linq表达式中的值(namecollet),而这些值通常会提供给EF,而您的数据库提供程序无法理解这些值。为了提高效率,只选择映射属性,而将视图模型上的任何计算值更改为只读属性。(PartenaireMapItem)

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

    该示例假设名称详细信息是只读的,则缓冲结果。如果名字/姓氏可以更新,只需每次返回计算的名称。

    其他属性应该很好,假设SeDeclace/ADomicile是字符串值而不是子实体。同样的情况也发生在施舍清单上。一个描述名称的字符串列表应该很好。