2010-12-09 30 views
3

J'essaie de trouver un moyen efficace de calculer les champs calculés d'un modèle Entity Framework dans Winforms. J'utilise Visual Studio 2008 et .NET framework 3.5. Un exemple serait pour EntityX, disons que j'ai columnA et columnB, et je veux une propriété calculée nommée sumAB. La façon dont je l'ai fait cela a été avec des classes partielles:Liaison de données de propriétés calculées dans Entity Framework

public partial class EntityX 
{ 
    public int sumAB 
    { 
     get 
     { 
      return this.columnA + this.columnB; 
     } 
    } 
} 

Je suis puis en utilisant Visual Studio pour ajouter EntityX en tant que source de données, donc je peux utiliser le glisser-déposer automatique de liaison de données. Le problème que j'ai est que les propriétés calculées n'apparaissent pas sous les champs de source de données. Je cherche un moyen d'avoir la liaison de données automatique des champs calculés.

Je sais que je pourrais le faire manuellement, mais je devrais également écrire manuellement tout le code de liaison pour actualiser le champ lorsque columnA ou columnB sont modifiés. Je n'ai pas non plus accès à ce champ calculé sur le serveur SQL.

Est-ce que quelqu'un connaît des façons d'accomplir ceci ou d'autres directions similaires à poursuivre?

Merci!

MISE À JOUR

J'ai testé cela sur une autre machine, en utilisant Visual Studio 2010 et .NET 4, et je reçois toujours le même comportement. Il est intéressant, je peux créer manuellement une zone de texte et ajouter une liaison de données, et il fonctionne très bien, comme ci-dessous:

sumABTextBox.DataBindings.Add(
    new System.Windows.Forms.Binding("Text", EntityXBindingSource, "sumAB", true)); 

Il a également travaillé si je plaçais la propriété dans le fichier .edmx, mais ce n'est pas souhaitable, comme il sera effacé chaque fois que la base de données sera mise à jour.

D'autres idées?

MISE À JOUR 2

Toujours pas de solution ... Je devais utiliser des solutions de rechange dans mon code pour respecter les délais. Je suis toujours très intéressé par cela si quelqu'un trouve une réponse ...

+0

Je ne vois pas pourquoi ce que vous faites ne fonctionnerait pas. C'est juste une propriété, alors comment le code qui génère la source de données la perçoit comme différente est au-delà de moi. Pouvez-vous explorer le fichier xml de la source de données dans votre solution et voir si les liaisons de propriétés existent? –

+0

J'ai regardé. Je ne suis pas familier avec la structure de ces fichiers, mais j'ai remarqué qu'il a le fichier généré automatiquement répertorié, mais il n'a pas mon fichier répertorié comme l'un des fichiers CSV dans la balise TypeInfo. J'ai essayé d'ajouter mon fichier, sauvegarder, recompiler, mais pas de chance ... – bunglestink

Répondre

1

Cela me semble étrange. Parce que j'utilise la même approche dans mon projet (Entity Framework, Self Tracking Entities, WCF, Winforms).

J'ai construit une simple application winforms pour le tester et la propriété "calculée" apparaît dans la propriété databindings.Text d'un contrôle textbox.

J'ai créé une classe simple:

public partial class Test 
{ 
    public int A { get; set; } 
    public int B { get; set; } 

    public Test() 
    { 
    } 
} 
public partial class Test 
{ 
    public int AB 
    { 
     get { return A * B; } 
    } 
} 

Ajouté BindingSource à une forme (avec source de données pointant vers un objet de test de type) et trois zones de texte binded à BindingSource et les propriétés: A, B et AB . Dans le constructeur de la forme, j'ai créé une instance de test, rempli les valeurs pour A et B, set bindingsource.DataSource à l'instance créée et pense que étaient groovy sur le formulaire;)

Ce cas de test simple ne serait pas différent de votre situation, à part que vous travaillez avec des entités qui sont hors-cours juste des objets. Je ne peux vraiment pas voir le problème de votre description ... D'autres commentaires pourraient m'aider à vous aider plus loin ...

+0

Les classes partielles d'EntityX sont-elles dans le même assemblage? Sinon, ils seraient compilés en deux "classes complètes" distinctes ... –

+0

Je viens de tester avec votre échantillon, et cela a bien fonctionné. Ils sont dans la même assemblée et l'espace de noms autant que je sache. L'entité que j'utilise est générée automatiquement à partir de la base de données existante, donc je ne suis pas sûr si cela affecte quelque chose. Je n'ai aucun problème à accéder à ces propriétés à partir du code, mais le mappeur de source de données ne fait que les ignorer pour une raison quelconque. – bunglestink

+0

Vous vous connectez à l'EF "directement" à partir d'une application winForms? Ou exposez-vous des services (WCF) et transportez les entités? Dans le dernier cas où vous ne partagez pas l'assembly qui contient les entités mais "connaissez" les entités clientide par génération de proxy, il se peut que votre propriété calculée ne soit pas décorée avec l'attribut [DataMember] ... donc le winforms/clientide ne connaîtra pas cette propriété. –

1

Je viens de poser la même question (WPF pas WinForms) hier - Show Computed Property in Entity Framework and WPF UI.

En résumé, je n'ai trouvé aucun support automatique. J'ai dû créer les colonnes dans mon DataGridView pour chaque propriété calculée. Ensuite, pour que le DataGridView sache que ces propriétés ont été mises à jour, je dois appeler OnPropertyChanged ("ComputedPropertyName") dans la méthode partielle OnChanged.

par exemple.

public partial class Test 
{ 
    public int AB 
    { 
     get { return A * B; } 
    } 

    public partial void OnAChanged() 
    { 
     OnPropertyChanged("AB"); 
    } 
    public partial void OnBChanged() 
    { 
     OnPropertyChanged("AB"); 
    } 
} 

S'il y a un moyen automatique pour que cela fonctionne, j'aimerais aussi le savoir.

+1

Oui ... c'est essentiellement ce que j'ai fait aussi ... ça ne fait pas depuis qu'il n'y aurait pas de façon automatique de faire ça ... – bunglestink

+0

Glad cela a fonctionné, acceptez-vous une réponse à cette question? – Chad