public void SetPropMergeMode(string sPropName, XStorageObjectPropMergeModes mergeMode) { if (m_propsMergeModes == null) { m_propsMergeModes = new HybridDictionary(1); } m_propsMergeModes[sPropName] = mergeMode; }
public override void Merge(XStorageObjectBase p_xobj) { base.Merge(p_xobj); XStorageObjectToSave xobj = p_xobj as XStorageObjectToSave; if (xobj == null) { Debug.Fail("Некорректная реализация XStorageObjectBase::Merge"); throw new ArgumentException(); } UpdateTS = UpdateTS | xobj.UpdateTS; if (xobj.IsToInsert) { m_state = XStorageObjectState.ToInsert; } foreach (string sPropName in xobj.Props.Keys) { if (!Props.Contains(sPropName)) { // свойства не было - добавим Props[sPropName] = xobj.Props[sPropName]; } else { XStorageObjectPropMergeModes mergeModeThis = GetPropMergeMode(sPropName); XStorageObjectPropMergeModes mergeModeForeign = xobj.GetPropMergeMode(sPropName); // если хотя бы для одного свойства стоит флаг "слабой" проверки, то отключаем проверку на совпадание значений свойств if (mergeModeThis == XStorageObjectPropMergeModes.Replace) { Debug.Assert(mergeModeForeign != XStorageObjectPropMergeModes.Replace, "Два свойства с признаком перезаписи - это некорректная ситуация"); // у текущего св-ва задан атрибут перезаписи, поэтому оставляем его в неприкосновенности (даже проверки не делаем) } else if (mergeModeForeign == XStorageObjectPropMergeModes.Replace) { Props[sPropName] = xobj.Props[sPropName]; } else { if (!isPropsEquals(Props[sPropName], xobj.Props[sPropName])) { throw new XMergeConflictException("Значения свойста " + sPropName + " отличаются: '" + Props[sPropName] + "' и '" + xobj.Props[sPropName] + "'"); } } } } // смерджим словарь свойств, данные которых загружены механизмом кусочного сохранения if (xobj.PropertiesWithChunkedData.Count > 0) { foreach (string sPropName in xobj.PropertiesWithChunkedData.Keys) { PropertiesWithChunkedData[sPropName] = xobj.PropertiesWithChunkedData[sPropName]; } } ParticipateInUniqueIndex = xobj.ParticipateInUniqueIndex | ParticipateInUniqueIndex; }