2010-08-10 7 views
0

J'ai une classe d'entité Client qui a la propriété Adresse qui est un objet de la classe Address et qui a peu de propriétés. Il ressemble à ceci:Services RIA et le type personnalisé de la propriété

public partial class Customer 
{ 
    public virtual int ID { get; set; } 

    public virtual string Symbol { get; set; } 

    public virtual string Name { get; set; } 

    public virtual string FirstName { get; set; } 

    public virtual string LastName { get; set; } 

    public virtual string NIP { get; set; } 

    public virtual Address Address { get; set; } 
} 

public partial class Address 
{ 
    public virtual int ID { get; set; } 

    public virtual string Descriptive { get; set; } 

    public virtual string Street { get; set; } 

    public virtual string City { get; set; } 

    public virtual string PostCode { get; set; } 

    public virtual string Country { get; set; } 
} 

Il n'y a aucune relation entre eux dans le sanse de base de données ou d'entités. L'adresse est juste un objet contenu dans la classe Customer et ils sont produits par un framework NHibernate. En fait, l'élément de mappage composant < /> est utilisé pour que:

<class name="Customer" table="`CRM_CUSTOMER`"> 
    <id name="ID"> 
     <generator class="native" /> 
    </id> 
    <property name="Symbol" unique="true" /> 
    <property name="Name" /> 
    <property name="FirstName" /> 
    <property name="LastName" /> 
    <property name="NIP" /> 
    <component name="Address" class="Address"> 
     <property name="Descriptive" /> 
     <property name="Street" /> 
     <property name="City" /> 
     <property name="PostCode" /> 
     <property name="Country" /> 
    </component> 
</class> 

Cependant, le client a généré le code ne voit pas une classe d'adresse/propriété du tout. Rien ne aide. J'ai lu des tonnes d'articles et rien. Donc, si quelqu'un pouvait aider, ce serait vraiment très apprécié :)

J'utilise VS 2010 Proffesional.

TIA

Roland

Répondre

0

Essayez et décorer l'adresse classe client propriété avec l'attribut [Inclure]. Cela devrait inviter RIA à retourner la propriété Address.

Si cela ne fonctionne pas, je verrai si la méthode de service de domaine côté serveur a la propriété d'adresse remplie correctement et si le problème est en passant les données à votre client Silverlight.

Vous pouvez ensuite essayer de traiter Address en tant qu'entité de domaine RIA et créer une relation entre le client et l'adresse. L'approche par inclusion devrait alors produire des résultats.

Espérons que cela aide.

0

[Désolé pour le retard ... Je suis de retour ici]

Le [Inclure] attribut ne vous aide pas, unfortunatelly. Il est nécessaire d'ajouter un attribut d'accompagnement [association]. Mais cela implique ce que je voulais éviter - imposer des champs supplémentaires et des implémentations aux objets de domaine qui étaient censés être simples et sans ces inutalités et qui étaient destinés au mappage ORM (NHibernate).

La solution est assez invasive et introduit tout ce qui est nécessaire pour une association par rapport aux entités - IDs. Cela a également eu son impact sur le mapping car j'ai dû mettre l'élément parent/< dans le composant < />. Juste pour obtenir une carte d'identité du parent - ont eu pas de meilleure idée sur la façon de l'obtenir ...

Enfin, les classes de domaine est devenu comme suit:

[MetadataType(typeof(CustomerMetadata))] 
public partial class Customer 
{ 
    [DataContract] 
    internal class CustomerMetadata 
    { 
     [Key] 
     [DataMember] 
     public int ID { get; set; } 

     [DataMember] 
     public string Symbol { get; set; } 

     [DataMember] 
     public string Name { get; set; } 

     [DataMember] 
     public string FirstName { get; set; } 

     [DataMember] 
     public string LastName { get; set; } 

     [DataMember] 
     public string NIP { get; set; } 

     [Include] 
     [Association("Customer_Address", "ID", "CustomerID", IsForeignKey = true)] 
     [DataMember] 
     public Address Address { get; set; } 
    } 
} 

... et

public partial class Customer 
{ 
    public virtual int ID { get; set; } 

    public virtual string Symbol { get; set; } 

    public virtual string Name { get; set; } 

    public virtual string FirstName { get; set; } 

    public virtual string LastName { get; set; } 

    public virtual string NIP { get; set; } 

    public virtual Address Address { get; set; } 
} 

pour le faire fonctionner, la cartographie a été modifiée à ce qui suit:

<class name="Customer" table="`CRM_CUSTOMER`"> 
    <id name="ID"> 
     <generator class="native" /> 
    </id> 
    <property name="Symbol" unique="true" /> 
    <property name="Name" /> 
    <property name="FirstName" /> 
    <property name="LastName" /> 
    <property name="NIP" /> 
    <component name="Address" class="Address"> 
     <parent name="Customer" /> 
     <property name="Descriptive" /> 
     <property name="Street" /> 
     <property name="City" /> 
     <property name="PostCode" /> 
     <property name="Country" /> 
    </component> 
</class> 

le < pa loyer /> élément est nouveau là. Je ne suis pas seulement sûr si un attribut optionnel pour faire de l'association une association de clé étrangère était correct ...J'ai également été surpris de constater que je n'ai besoin d'aucun service de domaine pour une adresse elle-même car le code généré le contient et toutes les autres choses que je m'attendais à voir au tout début de l'histoire avec les services RIA.

La solution est devenue vraiment envahissante et en tant que telle pas le parfait pour moi mais pour l'instant au moins satisfaisant. Pour l'instant ça marche. Je me demande seulement ce que je ferai avec l'association many-to-many dans NH?

Espérons que cela aide quelqu'un. À votre santé.

Roland