RIA Services и пользовательский тип недвижимости - PullRequest
0 голосов
/ 10 августа 2010

У меня есть класс сущности 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; }
}

Нет никакой связи между ними в рамках базы данных или сущностей.Адрес - это просто объект, содержащийся в классе Customer, и они создаются средой NHibernate.На самом делеДля этого используется элемент mapping:

<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

Roland

Ответы [ 2 ]

0 голосов
/ 15 августа 2010

[Извините за задержку ... Я вернулся]

К сожалению, атрибут [Включить] не помогает. Требуется добавить сопутствующий атрибут [association]. Но это подразумевает то, чего я хотел избежать - принудительно установил дополнительные поля и реализации для доменных объектов, которые должны были быть простыми и без таких ненужных и которые были предназначены для отображения ORM (NHibernate).

Решение является достаточно инвазивным и включает в себя все необходимое для ассоциаций в отношении сущностей - идентификаторы. Это также оказало влияние на отображение, так как мне нужно было поместить элемент внутри . Просто, чтобы получить удостоверение личности от родителя - понятия не имел, как его получить ...

Наконец, классы доменов стали следующими:

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

Элемент там новый. Я не только уверен, был ли корректным необязательный атрибут, чтобы сделать ассоциацию ассоциацией внешнего ключа ...

Меня также удивило, что я не нуждаюсь в какой-либо доменной службе для самого адреса, поскольку сгенерированный код содержит его и все другие вещи, которые я ожидал в самом начале истории со службами RIA. .

Решение стало действительно инвазивным и поэтому не идеальным для меня, но пока, по крайней мере, удовлетворительным. Пока это работает. Мне только интересно, что я буду делать с ассоциацией «многие ко многим» в NH?

Надеюсь, это кому-нибудь поможет. Приветствия.

Roland

0 голосов
/ 11 августа 2010

Попробуйте и украсьте свойство адреса класса Customer с помощью атрибута [Include].Это должно побудить RIA вернуть свойство Address.

Если это не сработает, я бы посмотрел, правильно ли заполнено свойство address на стороне сервера, и что проблема заключается в передаче данных вваш клиент Silverlight.

После этого вы можете попытаться обработать Address как объект домена RIA и построить отношения между клиентом и адресом.Подход включения должен давать результаты.

Надеюсь, это поможет.

...