RIA服务和物业的定制类型

时间:2010-08-10 14:27:25

标签: silverlight service ria

我有一个实体类Customer作为属性Address,它是Address类的一个对象,并且具有很少的属性。它看起来如下:

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框架生成。实际上< component /> map元素正在用于:

<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

罗兰

2 个答案:

答案 0 :(得分:0)

使用[Include]属性尝试并装饰Customer类的地址属性。这应该提示RIA返回Address属性。

如果这不起作用,我会看看服务器端域服务方法是否正确填充了地址属性,以及问题是将数据传递给Silverlight客户端。

然后,您可以尝试将Address视为RIA域实体,并在客户和地址之间建立关系。然后,包含方法应该产生结果。

希望这有帮助。

答案 1 :(得分:0)

[抱歉延迟...我回到这里]

不幸的是,[Include]属性无济于事。需要添加[association]伴随属性。但这意味着我想要避免的事情 - 对域对象强制执行其他字段和实现,这些域对象本来是简单的,没有这种不必要的东西,而且是用于ORM映射(NHibernate)。

该解决方案非常具有侵入性,并引入了与实体相关联的所有内容 - ID。这也对映射有影响,因为我需要放置&lt; parent /&gt; &lt; component /&gt;内的元素。只是为了从父母那里得到一个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>

&lt; parent /&gt;元素是新的。我不仅确定使关联成为外键关联的可选属性是否正确...

我也很惊讶我不会为地址本身提供任何域名服务,因为生成的代码包含它以及我希望在故事开头时使用RIA服务发生的所有其他事情。

解决方案变得非常具有侵略性,因此对我来说并不完美,但至少目前至少令人满意。现在它有效。我只是想知道我将与NH中的多对多关联做什么?

希望这有助于某人。欢呼声。

罗兰