Проблемы с обновлением отношений один ко многим при использовании сервисов ria с nhibernate - PullRequest
0 голосов
/ 05 октября 2010

Я работаю над приложением silverlight и использую службы данных RIA и nHibernate.

В настоящее время у меня есть объект, имеющий отношение один ко многим с другим объектом.

public class Employer {
    [Key]
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
}

public class Person {
    [Key]
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
    [Include]
    [Association("PersonCurrentEmployer", "CurrentEmployerId", "Id", IsForeignKey = true)]
    public virtual Employer CurrentEmployer { get; set; }
    public virtual int? CurrentEmployerId { get; set; }
}

Свойство CurrentEmployerId установлено для отсутствия вставки и обновления в сопоставлениях.

Со стороны Silverlight я установил свойство CurrentEmployer этого лица, чтобы существующий работодатель на стороне клиента отправил изменения.

personEntity.CurrentEmployer = megaEmployer;
dataContext.SubmitChanges();

На стороне сервера для сущности лица CurrentEmployerId установлено значение megaEmployer.Id, а для CurrentEmployer - null. Поскольку я использую свойство CurrentEmployer, а не CurrentEmployerId для сохранения отношения, отношение не изменяется.

Есть ли способ заставить RIA отправить объект CurrentEmployer с сохранением или мне нужно использовать CurrentEmployerId на стороне сервера, чтобы загрузить работодателя и установить для него CurrentEmployer?

Ответы [ 3 ]

1 голос
/ 24 марта 2011

Причина, по которой вы не видите своего CurrentEmployer на стороне клиента, заключается в том, что у вас неправильно настроены ассоциации.

Службы RIA не работают со ссылками обычным способом, поэтому ссылки на вашего работодателя на стороне клиента не работают. Службы RIA работают с наборами объектов и создают «ссылки» на основе атрибутов ассоциации. Вашему работодателю необходимо имущество с объединением обратно к Лицу, как указано ниже.

    public class Employer 
    {
        private Person person;

        [Key]
        public virtual int Id { get; set; }
        public virtual string Name { get; set; }
        public virtual int PersonID { get; set; }

        [Include]
        [Association("PersonCurrentEmployer", "PersonID", "Id", IsForeignKey = false)]
        public virtual Person Person    {
            get
            {
                return this.person;
            }

            set
            {
                this.person = value;
                if (value != null)
                {
                    this.PersonID = value.Id;
                }
            }
        }
    }
1 голос
/ 07 февраля 2011

Есть ли способ заставить RIA отправить объект CurrentEmployer с сохранением или мне нужно использовать CurrentEmployerId на стороне сервера, чтобы загрузить работодателя и установить его в CurrentEmployer?

Я тоже сталкиваюсь с этой проблемой. По сути, вы должны либо использовать атрибут [Composition] (который я бы не рекомендовал), либо загрузить объект из базы данных на стороне сервера. Композиция запутывает модель данных клиента и не заботится обо всех случаях, о которых вам нужно беспокоиться. (есть много больше о Композиции на форумах РИА.silverlight.net)

[ОБНОВЛЕНИЕ] Как только вы внедрите кэш 2-го уровня, беспокойство о чтении вспомогательных сущностей из базы данных в основном исчезнет, ​​так как они будут загружены из кеша. Кроме того, если вам нужен только прокси-сервер для NHibernate, чтобы не жаловаться, тогда посмотрите на Get / Load (никогда не сможете вспомнить, какой) .. который вернет NH-прокси и приведет к выбору одного столбца и объекта из базы данных. , (Если вы попытаетесь получить доступ к другому свойству прокси-сервера, NH выберет все остальное. Подробнее об этом можно прочитать в блоге Айенде ..) [/ UPDATE]

Самая большая проблема, с которой я столкнулся, - это заставить NHib реально сохранить и загрузить отношения. (Я также использую свободный). Ответ ответственных сторон до сих пор звучал так: «Ух ты, ты не можешь этого сделать. Похоже, что RIA не была разработана с учетом NHib» ... что это дерьмовый ответ, ИМХО. Вместо того, чтобы помочь мне понять, как отобразить это, они говорят мне, что я делаю это неправильно из-за наличия ForeignKey в моей сущности (NHib не должно волновать, что у меня есть моя FK в моей сущности) ...

0 голосов
/ 07 марта 2011

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

Кстати, у вас была та же идея, что и у меня: заставить внешний ключ не вставлять / обновлять. НО, я также сделал это Generated.Always (). таким образом он всегда будет читать значение обратно.

Дополнительно я переопределяю DomainService.Submit () и DomainService.ExecuteChangeSet (). Я запускаю транзакцию NHibernate в Подтверждении (хотя я еще не уверен, что это делает то, что я ожидаю).

Вместо того, чтобы помещать мою логику сохранения в методы InsertSomeEntity () или UpdateSomeEntity (), я делаю все это внутри ExecuteChangeSet. это происходит из-за NHibernate, и его НУЖНО иметь граф сущностей полностью двунаправленный и гидратированный до выполнения действий в NHibernate. Это включает в себя загрузку сущностей из базы данных или сеанса, когда дочерний элемент попадает на связь из служб RIA. (Я пошел по пути написания методов, чтобы получить различные другие части графика, так как эти специализированные методы нуждались в них, но я обнаружил, что проще сделать все это одним методом. Более того, я столкнулся с проблемой желания RIA сначала выполнить вставку / обновление для дочерних объектов, что для новых элементов является проблемой.)

Я хочу прокомментировать атрибут композиции. Я все еще поддерживаю мой предыдущий комментарий о том, что не рекомендую его для стандартных дочерних коллекций сущностей, ОДНАКО, он работает БОЛЬШОЙ для поддержки компонентов NHibernate, потому что в противном случае RIA никогда не отправит обратно родительский экземпляр (композиции), который требуется для работы NHibernate. правый.

Я не предоставил здесь никакого кода, потому что мне нужно было бы сделать некоторые серьезные изменения, но для меня это не проблема, если вы хотите его увидеть.

...