11
votes

Comment améliorer l'interaction de l'entité et JavaScript

C'est une question assez vague / subjective. Je veux savoir s'il s'agit de la meilleure façon d'envoyer / récupérer des données vers / depuis le navigateur à l'aide d'appels AJAX. Sur le site Web de l'arrière, je souhaite utiliser le cadre d'entité. Vous trouverez ci-dessous deux exemples de fonctions.

Les critères de "meilleur" sont la vitesse du code d'écriture, du code lisible et de l'architecture robuste. P>

Merci pour tout retour et suggestions et commentaires. P>

GET FONCTION FORT> P>

[WebMethod]
public bool EmployeeSave(AjaxEmployee emp)
{
    using (Time_TrackerEntities ctx = new Time_TrackerEntities())
    {
        var results = from item in ctx.Employees
                      where item.ID == emp.ID
                      select item;

        var myEmp = results.FirstOrDefault();
        if (myEmp == null)
        {
            myEmp = new Employee();
            ctx.Employees.AddObject(myEmp);
        }

        myEmp.Employee_ID = emp.Employee_ID;
        myEmp.First_Name = emp.First_Name;
        myEmp.Middle_Name = emp.Middle_Name;
        myEmp.Last_Name = emp.Last_Name;
        myEmp.Supervisor_ID = emp.Supervisor_ID;
        myEmp.Active = emp.Active;
        myEmp.Is_Supervisor = emp.Is_Supervisor;

        return ctx.SaveChanges() > 0;
    }
}


2 commentaires

Pourquoi avez-vous un AJAXemployee distinct classe? Est-ce une projection de votre entité ?


La classe distincte est de mieux sérialiser avec Json lors de l'envoi à JavaScript. Parce qu'il existe une relation entre l'employé et l'enregistrement TIME_OFF, la sérialisation ne se produit pas correctement selon: mytechworld.OfficciCuity.com/?p=577


3 Réponses :


3
votes

Je trouve que c'est généralement une bonne idée d'essayer d'utiliser mes entités directement sur le contrat de données. C'est possible et fonctionne bien dans certains cas, mais à tout moment, mon modèle d'objet obtient même un petit complexe, je commence à avoir à vous soucier du graphique de l'objet de manière à ce que je ne veux pas avoir à.

Au lieu de cela, et c'est indépendamment du client, mais il est applicable à un client JS, j'essaie tout autant, j'essaie de penser aux classes de contrat de données comme pure Data Camions (DTO) sans mappage dans EF. Ces classes ne sont que des documents que je passe, le corps du message si vous voulez. Ils pourraient se traduire par des commandes sur mon modèle ou pourraient être utilisés pour peupler une requête, mais ce n'est pas les entités elles-mêmes.

Ceci, je trouve, simplifie beaucoup les choses. Cela peut ressentir plus de code lorsque vous écrivez d'abord un service simple, mais au cours de la vie, cela rend les choses beaucoup plus maintenues.

et juste comme une note latérale, vous devez également envisager de séparer vos responsabilités un peu mieux. La classe de service Web ne doit pas avoir la responsabilité de la création directe de la mise au rebut de l'ADN du contexte de données, elle devrait dépendre d'une interface DAO ou de référentiel (ou d'un service de domaine) qui gère tout ce type pour vous (et applique des transactions au besoin, etc.).


0 commentaires

0
votes

Votre méthode get peut graquer.

Si cette ligne renvoie NULL: P>

   where item2.Employee_ID == emp.Employee_ID


0 commentaires

9
votes

Il y a quelques améliorations à apporter.

SAVE () - NE PAS COPIER DE GLES-TO ROISE, utilisez EF intégré à la logique forte> p>

de ceci: p> xxx pré>

Vous pouvez le faire: p>

ctx.employest.applyCurrentValues ​​(EMP) code>. P>.

Qu'est-ce que cela fait, est rechercher une entité avec la même clé dans le graphique (qu'il y a, car vous venez de la récupérer avec FirstOrdefault () code>) et remplace les valeurs scalaires avec le Entité que vous passez dans - ce qui est exactement ce que vous faites. p>

Donc, vos 7 lignes deviennent 1, plus si vous ajoutez des propriétés scalaires supplémentaires - vous n'aurez pas à refacturer votre code. Rappelez-vous simplement - ne fonctionne que pour Propriétés scalaires em>, pas propriétés de navigation em>. P>

Pourquoi construire une requête pour la récupération principale? Il suffit d'utiliser un prédicat à un seulefault () fort> p>

au lieu de ceci: p> xxx pré>

fais cela: p>

var myEmp = ctx.Employees.WithId(emp.Id).SingleOrDefault();


3 commentaires

Jamais connu sur ApplyCurrentValues ​​ +1!


ApplyCurrentValues ​​sonnez comme une recette des problèmes de sécurité. Cela ressemble à la masse appliquer un bug qui a frappé GitHub.


Juste une chose que vous devez accéder au contexte envelopper pour utiliser s'appliquerCurrentValues ​​ Stackoverflow.com/questions/14579590/... codage heureux :)