2010-10-28 3 views
1

Je souhaite créer un objet Employee en utilisant le constructeur;C# Utilisation d'un ID pour créer un objet dans un constructeur

employés du secteur public (int _employeeId)

Dans le corps je veux lire un employé de la base de données. Cependant, je ne peux pas m'en tirer;

using (SHPContainerEntities db = new SHPContainerEntities()) 
{ 
    this = db.Employee.Where(x =>x.EmployeeId == _employeeId).SingleOrDefault() as Employee; 
} 

Parce que "this" est en lecture seule. Alors, comment je fais ça?

+0

pourquoi ne pas faire ceci: e = employé readonly db.Employee.Where (x => x.EmployeeId == _employeeId) .SingleOrDefault() comme employé – Sheen

+0

Je ne veux pas avoir un objet est en lecture seule. Je signale que "ceci" est en lecture seule, que cela vous plaise ou non. Je suis sûr qu'il y a une très bonne raison pour cela. – arame3333

Répondre

4

Vous pouvez tout simplement ré-écrire comme une méthode statique:

public static Employee Get(int id) { 
    return db.Employee.SingleOrDefault(x => x.EmployeeID == id); 
} 

(note: ce qui précède est juste pour illustration, il y a réels problèmes associés à un ensemble de données contexte statique (db) - ne pas faire ça! Il devrait vraiment utiliser une méthode GetContext() ou similaire, qui s'inquiète à ce sujet)

+0

Oui, c'est ce que je fais en ce moment. Cela me fait écrire; this.Employee = nouvel employé(); this.Employee = Employee.GetEmployee (_employeeId); et je préférerais faire le travail dans le constructeur à la place si possible. – arame3333

+0

@ arame3333 bien, vous ne pouvez pas. Vous auriez besoin de copier toutes les propriétés manuellement, * et * alors le contexte de données ne croirait pas que c'est le même objet. Fondamentalement, cela ne va pas fonctionner. –

+0

Tout le monde est d'accord, alors vous devez avoir raison. – arame3333

0

Vous pouvez le faire dans une autre classe, qui rend réellement l'objet employé.

1

Vous devez changer votre style de codage. vous devez obtenir l'employé d'un autre endroit. par exemple, essayez d'utiliser le modèle référentiel:

var employee = EmployeeRepository.GetEmployee(emplieeID); 
2

Comme l'indique vous ne pouvez pas régler « cette » car il est en lecture seule (pour une bonne raison). Dans votre cas, l'objet est déjà créé lorsque le constructeur s'exécute, ce qui signifie que vous ne pouvez pas changer le type de l'objet. Ce que vous pourriez examiner (et ce qui est déjà proposé) est d'avoir une méthode statique qui crée la classe pour vous. Recherchez le motif de conception "Usine", par ex. http://en.wikipedia.org/wiki/Factory_method_pattern

0

Humm ...

'ce' est une référence à votre instance actuelle de l'objet. Alors que dans le ctor, vous êtes en train de créer et de construire l'objet lui-même. Vous ne pouvez pas changer votre référence à l'intérieur du ctor et assigner dans votre soi ce qui est la raison fondamentale de ne pas permettre de le changer ou de le lire seulement.

Le modèle d'usine mentionné par d'autres est la solution pour cela.

HTH

Questions connexes