internal void RegisterNewItem(ClientXObject <TKind> _child, Guid _collectionOwnerUid, int _fieldId) { var ownerDescriptor = GetDescriptor(_collectionOwnerUid); ClientXObjectDescriptor <TKind> childDescriptor; if (m_descriptors.TryGetValue(_child.Uid, out childDescriptor)) { if (!childDescriptor.CollectionOwnerUid.Equals(_collectionOwnerUid)) { throw new ApplicationException("Object owned by another parent"); } ProcessAddedToCollection(_child, ownerDescriptor, _fieldId); return; //throw new ApplicationException("Object is not unique"); } var kindId = KindToInt(_child.Kind); var report = new XReport(_child.Uid, _child.GetChanges(), kindId, EState.SINGLE); m_transport.AddNew(report, m_sessionId, _collectionOwnerUid); var descriptor = new ClientXObjectDescriptor <TKind>(_child, this, kindId, _collectionOwnerUid); m_descriptors.Add(_child.Uid, descriptor); ProcessAddedToCollection(_child, ownerDescriptor, _fieldId); _child.SetClientInternal(this); _child.OnInstantiationFinished(); }
/// <summary> /// Вызывается для создания дескриптора для нового объекта /// </summary> /// <param name="_newBorn"></param> /// <param name="_client"></param> /// <param name="_kindId"></param> /// <param name="_parentUid"></param> public ClientXObjectDescriptor(ClientXObject <TKind> _newBorn, AbstractXClient <TKind> _client, int _kindId, Guid _parentUid) : this(_newBorn.Uid, _client, _parentUid) { var child = _newBorn as IClientXChildObject <TKind>; if (child != null) { child.SetParent(_parentUid); } m_instances.Add(_newBorn.GetType(), _newBorn); m_instancesCounter.Add(_newBorn, 1); Kind = _kindId; ResetState(); _newBorn.Changed += XObjectChanged; var changes = _newBorn.GetChanges(); if (changes.Any()) { Report = new ServerXReport(_newBorn.Uid, _newBorn.GetChanges(), 0, m_client.KindToIntInternal(_newBorn.Kind), EState.SINGLE); } }