2010-08-10 57 views
0

我有一個實體類Customer作爲屬性地址是Address類的對象,並且屬性很少。它看起來如下:RIA服務和屬性的自定義類型

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; } 
} 

他們之間沒有關係,數據庫或實體。 Address只是Customer類中包含的一個對象,它們由NHibernate框架生成。事實上,<組件/>映射元素被用於該:

<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> 

但是,客戶端生成的代碼不會看到Address類/屬性的。沒什麼幫助。已經閱讀了大量的文章,並沒有。所以,如果任何人都可以提供幫助,那麼將會非常感謝:)

我正在使用VS 2010 Proffesional。

TIA

羅蘭

回答

0

嘗試和裝飾用[包含]屬性Customer類地址屬性。這應該提示RIA返回Address屬性。

如果這不起作用,我會看到如果服務器端域服務方法的地址屬性正確填充,並且如果問題是將數據傳遞給您的Silverlight客戶端。

然後,您可以嘗試將Address作爲RIA域實體並建立客戶與地址之間的關係。包含方法應該產生結果。

希望這會有所幫助。

0

[抱歉耽擱...我回到這裏]

的[包含]屬性沒有幫助,可惜的。需要添加一個[關聯]伴隨屬性。但是這意味着我想要避免的 - 強制實現域對象的附加字段和實現,這些附加字段和實現既簡單又沒有這些不必要的地方,並且是爲了ORM映射(NHibernate)而設計的。

該解決方案非常有創意,並且引入了與實體關聯所需的所有內容 - ID。這也對映射產生了影響,因爲我需要將< parent />元素放入<組件/>中。只是爲了得到來自父母的ID - 已經對如何得到它沒有更好的主意......

最後,域類成爲如下:

[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; } 
    } 
} 

...和

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; } 
} 

要使其工作,映射已更改爲以下幾點:

<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> 

的< PA租/>元素是新的。我不僅確定是否將可選屬性設爲外鍵關聯是正確的...

對於我來說,我並不需要任何域服務,因爲生成的代碼包含它以及我在RIA服務故事開始時預期會發生的所有其他事情。 ..

該解決方案成爲真正的侵入性,因此對我來說並不完美,但現在至少令人滿意。現在它起作用了。我只想知道我會在新罕布什爾州與多對多的協會合作嗎?

希望這可以幫助別人。乾杯。

羅蘭