2010-09-22 1 views
2

J'ai une application Silverlight 4 où j'utilise des classes partagées. Dans le projet .Web, j'ai une classe appelée "X.Shared.cs". Cette classe a trois propriétés de chaîne. Lorsque je compile l'application, elle donne une erreur en disant "Le type 'X' contient déjà une définition pour 'Y'". Il semble que les propriétés du code généré dans l'application Silverlight soient considérées comme des doublons. J'ai essayé de nettoyer ma solution et de la reconstruire, cela aide de temps en temps mais est totalement incohérent.Silverlight Classes partagées dans le service RIA provoquant des erreurs de construction - Le type 'X' contient déjà une définition de 'Y'

Est-ce que quelqu'un a eu de l'expérience dans ce problème? Est-ce que je fais peut-être quelque chose de mal?

Le code de la classe partagée (X.Shared.cs) est la suivante:

public partial class VideoItem 
{ 
    [Key] 
    public String ID 
    { 
     get; 
     set; 
    } 

    public String ImageURL 
    { 
     get; 
     set; 
    } 

    public String URL 
    { 
     get; 
     set; 
    } 
} 

Voici une capture d'écran de l'explorateur de solution montrant le fichier partagé généré: alt text

Répondre

3

Pour résoudre ce problème, j'ai créé une classe .shared.cs vide ne contenant aucune propriété (il s'agit évidemment d'une classe partielle). J'ai ensuite créé une autre classe partielle dans le même espace de nom avec ce nom de classe et ici j'ai mis toutes les propriétés dont j'avais besoin d'accéder.

+0

Il est bizarre que vous deviez faire cela. J'aurais aimé aller au fond de la cause car je n'ai pas l'air de ce problème. +1 pour la pensée créative :) –

+0

Merci et merci pour votre aide! Si vous rencontrez le problème à l'avenir, vous pouvez au moins utiliser cette solution! J'adorerais le comprendre si ... – Madeleine

0

Avez-vous vérifié que la définition de classe dans X.Shared.cs est partielle?

à savoir

public partial class MyEntity 
{ 
    ... 
} 
+0

Merci - il est marqué comme partiel – Madeleine

+0

Avez-vous un autre fichier qui définit VideoItem? Dans ma solution dans le projet .Web, mon entité est définie dans MyDomainService.metadata.cs.Dans ce fichier mon entité a la [Clé] etc. Dans le partage je n'ai pas d'annotations et les propriétés s'ajoutent à ma définition d'entité principale. – Rus

+0

J'ai résolu ceci en créant une classe .shared.cs vide, puis en créant une autre classe partielle pour contenir toutes les propriétés! Cela semble avoir fait l'affaire. Je ne vois pas pourquoi cela fonctionne - peut-être que je ne comprends pas bien comment les classes partagées doivent être utilisées. – Madeleine

0

Avez-vous ajouté manuellement une référence aux X fichiers .shared.cs dans votre application Silverlight?

La copie est effectuée automatiquement par des projets Web/clients connectés par des services RIA. Les fichiers se retrouvent dans un dossier caché Generated_Code sous votre application cliente.

Activez les fichiers cachés et vérifiez si vous avez le même fichier inclus deux fois dans l'application Silverlight.

+0

Je ne l'ai pas ajouté manuellement car il devrait être automatiquement référencé car il a l'extension .Shared.cs. Quand j'ouvre des fichiers cachés, je peux voir le code généré dans l'application – Madeleine

+0

@Vixen: Ce serait un non alors :) Nous devons en quelque sorte deviner car il n'y a pas grand-chose à faire. Plutôt que de nettoyer le projet, effacez tous les dossiers bin et obj et réessayez (clean ne nettoie pas beaucoup). Il n'y a certainement rien de mal avec votre classe actuelle (construit bien dans une bibliothèque RIA ici). –

+0

Merci pour l'aide. Malheureusement, la suppression des dossiers bin et obj ne semble pas avoir aidé. Le message d'erreur dans la construction est: [...] \ Generated_Code \ Models \ VideoItem.shared.cs (24,23): erreur CS0102: le type '[...]. Services.Web.Models.VideoItem' déjà contient une définition pour 'URL'. C'est comme si c'est la construction du code généré en premier ou quelque chose ... – Madeleine

2

Il existe une limitation dans la génération de code. Pour éviter de générer des membres en double dans les fichiers partagés ou liés, les membres ne peuvent pas utiliser les propriétés implémentées automatiquement. Donc, pour contourner ce problème, il vous suffit de définir votre propre get et set. Gardez à l'esprit qu'il devrait y avoir une bonne raison de ne pas laisser la génération de code RIA créer les membres. Pour permettre à RIA de créer les membres, il vous suffit de ne pas lier ou partager votre entité avec le client, mais de l'exposer via une méthode de requête.

De http://msdn.microsoft.com/en-us/library/ee707359%28VS.91%29.aspx

Éviter dupliquées Membres

Lors de la génération d'une classe de proxy entité, il est possible que le même type et membre ont déjà été définis dans le projet client en utilisant des types partiels. Vous avez peut-être défini le membre dans du code partagé ou dans du code qui n'existe que dans le projet client. Les services RIA vérifient les membres existants avant de générer la classe proxy. Tout membre déjà défini ne sera pas généré dans la classe proxy. [Non inclus - Les membres de l'entité ne doivent pas utiliser les propriétés implémentées automatiquement. Les fichiers partagés et liés du projet du serveur au client sont la seule méthode pour éviter de générer le membre.]

Questions connexes