WCF RIA SubmitChanges не отправляет основные свойства обратно на сторону сервера - PullRequest
0 голосов
/ 07 февраля 2011

Смотри, у меня есть эти довольно простые модели Master-Detail:

Рука - мастер пальцев (палец - деталь руки)

Так на стороне клиента:

Hand hand = domainService.Hands[0];                 //  get some hand, doesn't matter
...
Finger f = new Finger() { f.Id = Guid.NewId() };
f.Hand = hand;                                      //  make connection !!
domainService.Fingers.Add(f);
domainService.SubmitChanges(OnSubmitCompleted, null);   //  error is here

На стороне сервера:

public void Insert<T>(T obj)
{
    try
    {
        using (ISession session = _factory.OpenSession())
        using (ITransaction transaction = session.BeginTransaction())
        {
            session.SaveOrUpdate(obj);   //  NHibernate error: not-null property references a null or transient value
            transaction.Commit();
        }
    }
    catch (Exception ex)
    {
        throw ;
    }
}

Проблема в действительности заключается в том, чтобы не отправлять ассоциации обратно через провод WCF. Поэтому на стороне сервера свойство Hand имеет значение NULL, но не должно (нарушение) - я просто хочу обновить свой finger.Hand свойство

Это даже не композиция - мне не нужна эта причина ее ограничений

вот класс metaAttribute:

    [MetadataType(typeof(Finger.FingerMetadata))]
public partial class Finger
{
    //[Required(AllowEmptyStrings = true)]
    //[Exclude]
    public virtual Guid HandID { get; set; }
    //{
    //    get { return Hand.Id; }
    //}

    internal sealed class FingerMetadata
    {
        [Key]
        public Guid Id  { get; set; }

        [Include]
        //[RoundtripOriginal]
        //[ExternalReference]
        [Association("Finger-Hand", "HandID", "Id")]
        //[ConcurrencyCheck]
        //[Composition]
        public Hand Hand { get; set; }
    }
}

[MetadataType(typeof(Hand.HandMetadata))]
public partial class Hand
{
    internal sealed class HandMetadata
    {
        [Key]
        public Guid Id  { get; set; }

        [Include]
        //[ExternalReference]
        [Association("Hand-Finger", "Id", "HandID")]
        //[Composition]
        public IList<Finger> Fingers { get; set; }
    }
}

Я видел ту же проблему здесь http://forums.silverlight.net/forums/p/205220/480824.aspx, но никто не знает .. Пожалуйста, помогите!

Спасибо!

Ответы [ 2 ]

1 голос
/ 03 ноября 2011

Вы можете сделать две вещи:

  1. Применить [состав] к вашей ассоциации

  2. Создание методов обновления для всех нижних уровней Переопределенная защита от перегрузки bool PersistChangeSet () в доменной службе:

    protected override bool PersistChangeSet() 
    { 
        Customer changedCustomer; 
        bool success = true;
        foreach (var item in ChangeSet.ChangeSetEntries) 
        { 
           if (item.Entity.GetType() == typeof(Customer)) 
           { 
              changedCustomer = (Customer)item.Entity; 
              success = changedCustomer.Save(); 
              if (!success) 
                break; 
           } 
       } 
       return success; 
    

    }

См. http://msmvps.com/blogs/deborahk/archive/2010/07.aspx

1 голос
/ 14 июля 2011

Если вам все еще нужна помощь в использовании служб RIA (в отличие от служб данных)

В недавнем прошлом я довольно много работал с этими двумя технологиями и предоставил некоторую информацию оСсылка на форумы SL, которую вы разместили выше:

«Ассоциация« один ко многим »на стороне сервера является пустой» (forums.silverlight.net)

...