2009-10-22 6 views
1

Mon modèle EF a été généré à partir de ma base de données SQL Server. J'ai ensuite généré un DomainService pour RIAServices par rapport au modèle EF. L'une des entités est appelée "EntryCategories". Le DomainService a créé cette méthode:RIAServices types non pris en charge sur DomainService construit manuellement

public IQueryable<EntryCategories> GetEntryCategoriesSet() 
{ 
    return this.Context.EntryCategoriesSet; 
} 

Depuis mon modèle d'affichage de l'interface utilisateur semble tout à fait différent du modèle physique, j'ai décidé d'écrire mon propre DomainService pour cela et des entités apparentées. Oui, je sais que nous sommes censés modifier la génération mais il y a tellement de choses là-dedans et je voulais me concentrer sur une petite chose.

J'ai enlevé le EnableClientAccess attribut du produit DomainService et a ajouté une nouvelle classe appelée ClientDomainService et encapsulées en elle le produit DomainService:

[EnableClientAccess()] 
public class ClientDomainService : DomainService 
{ 
    // the generated domain service encapsulated in my new one. 
    private DataDomainService _dcds = new DataDomainService(); 

    // reimplement one of the DataDomainService methods 
    public IQueryable<EntryCategories> GetEntryCategories() 
    { 
     return (from t in _dcds.GetEntryCategoriesSet() where t.EntryCategoriesVersions.EntryCategoriesVersionId == datahead.EntryCategoriesVersions.EntryCategoriesVersionId orderby t.DisplayOrder select t); 
    } 
} 

La chose poing j'ai essayé est de ré-écrire la méthode GetCateogoriesSet mais avec les données sous-jacentes filtrées en fonction d'une autre entité de ma classe (non représentée). Mais quand je construis cela, une erreur apparaît:

Entity 'DataProject.Web.EntryCategories' has a property 'EntryCategoriesVersionsReference' with an unsupported type 

Si je commente mon CientDomainService, remplacer le EnableClientAccess attribut généré DomainService et placez le filtrage analogue LINQ dans la méthode GetEntryCategoriesSet d'origine, le projet compile sans erreurs.

Quel est si spécial sur le DomainService généré que mon nouveau n'a pas? Est-ce le fichier metadata.cs?

Répondre

0

Si vous souhaitez exposer une entité spécifique sur un service de domaine, vous aurez à provde au moins une méthode de requête pour elle. Cela est également requis lorsque l'entité est uniquement accédée en tant qu'enfant d'une autre entité.

Dans ce cas, vous devez ajouter les EntryCategoriesVersions EntitySet au service de domaine, pour obtenir le scénario fonctionne correctement.

4

Quelle est la particularité du service de domaine généré n'est pas le fichier .metadata.cs (vous pouvez le garder et l'utiliser, mais cela ne résout pas votre problème).

Le problème semble en quelque sorte parce que les services RIA (?) A besoin d'un 'domaine Description du service fournisseur' pour la Linq exposée à des entités EF. La classe LinqToEntitiesDomainService possède déjà LinqToEntitiesDomainServiceDescriptionProviderAttribute, de sorte que les services de domaine générés qui en héritent héritent également du fournisseur.

Lorsque vous créez votre propre service de domaine personnalisé, dérivé de DomainService, et d'exposer les entités à travers elle, vous devez appliquer vous-même attribut. En outre, comme le fournisseur ne peut déduire le type de contexte d'objet de la classe de base du service de domaine (ce qu'il peut faire si la classe de base est LinqToEntitiesDomainService), vous devez spécifier le type de contexte d'objet dans le constructeur d'attribut:

[EnableClientAccess()] 
[LinqToEntitiesDomainServiceDescriptionProvider(
          typeof(YourObjectContextType))] 
public class ClientDomainService : DomainService 
{ 
    ... 
} 

Cela devrait le réparer.

Notez que cela signifie que si vous aviez espéré faire abstraction de votre contexte de l'objet à partir de votre service de domaine, vous serez déçu. J'ai opté pour le modèle de référentiel apparemment populaire où tout le code qui opère sur le contexte de l'objet va dans un fournisseur utilisé par le service de domaine. Cela facilite les tests unitaires, mais ne supprime évidemment pas la dépendance du service de domaine au contexte de l'objet.Le contexte est requis pour que les services RIA aient un sens pour vos entités, ou au moins celles référencées par l'entité de domaine (telles que EntryCategoriesVersions dans votre cas).

+0

La réponse de Tor Haugen a fonctionné pour moi. Je n'ai pas encore assez de représentant pour remettre sa réponse à plus tard. Je devrais noter que j'ai créé une classe de base pour mon contexte de domaine de service RIA que je peux réutiliser à travers différents projets, et la classe qui définit réellement les entités est celle que j'ai l'attribut [LinqToEntitiesDomainServiceDescriptionProvider]. Par conséquent, la référence à l'objectcontext n'est pas un gros problème (pour moi), puisque je référence directement les entités de ce context-object spécifique. Merci pour votre aide! –

+0

Pour plus d'explications sur les façons dont ce problème peut se produire, lisez ce fil de discussion. http://forums.silverlight.net/p/233457/583536.aspx –

0

De quel type est EntryCategoriesVersionsReference? Essayez d'ajouter une annotation [DataContract] au type et [Key] et [DataMember] appropriés. Cela devrait aider avec le marshalling.

Questions connexes