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>
[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;
}
}
3 Réponses :
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 à. P>
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. P>
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. p>
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.). p>
Votre méthode get peut graquer.
Si cette ligne renvoie NULL: P>
where item2.Employee_ID == emp.Employee_ID
Il y a quelques améliorations à apporter.
de ceci: p> Vous pouvez le faire: 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 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> fais cela: p> ctx.employest.applyCurrentValues (EMP) code>. P>. FirstOrdefault () code>) et remplace les valeurs scalaires avec le Entité que vous passez dans - ce qui est exactement ce que vous faites. p> var myEmp = ctx.Employees.WithId(emp.Id).SingleOrDefault();
Jamais connu sur ApplyCurrentValues Code> +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
Pourquoi avez-vous un
AJAXemployee distinct CODE> classe? Est-ce une projection de votre code> entité code>?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