Глубокое клонирование сущности из одной организации в другую - PullRequest
1 голос
/ 23 декабря 2011

Итак, еще одна забавная задача под рукой.

Мы создали службу Windows для синхронизации некоторых записей между двумя работающими организациями CRM 2011.

Мы изучили глубокое клонирование, и это то, что мы хотим, но, похоже, что оно глубоко клонирует EntityReference, а не фактическую сущность.

Любые идеи, советы и т. Д. Были бы замечательными.

Ответы [ 2 ]

2 голосов
/ 09 ноября 2012

Я успешно глубоко клонирую с помощью этого кода:

Я использую контекст службы XRM, копирую клон в новую сущность, удаляю атрибуты, которые определяют его как уже существующее право (например, первичный ключи т. д.) установить отношения с существующими объектами, а затем отправить его в метод create.Я должен явно сделать то же самое для всех связанных объектов (что я сделал для веб-файлов и заметок, в моем примере)

        var clonedwebpage = ((Entity)webpage).Clone(true);

        clonedwebpage.Id = Guid.NewGuid();
        clonedwebpage.Attributes.Remove("adx_webpageid");
        //clonedwebpage.Attributes.Remove("adx_pagetemplateid");
        clonedwebpage.EntityState = null;
        clonedwebpage["adx_websiteid"] = new EntityReference("adx_webpage",livesiteGuid);
        //clonedwebpage["adx_parentpageid"] = 
        // create the template guid
        Guid tempGuid = new Guid(templateguid);
        clonedwebpage["adx_pagetemplateid"] = new EntityReference("adx_pagetemplate",tempGuid); // set the template of the new clone


        //serviceContext.Attach(cloned);
        //serviceContext.MergeOption = MergeOption.NoTracking;

        Guid clonedwebpageguid = _service.Create(clonedwebpage);

         //var webpage = serviceContext.Adx_webpageSet.Where(wp => wp.Id == webpageguid).First();
        //var notes_webile = serviceContext.Adx_webfileSet.Where(wf => wf.








        //*********************************** WEB FILE *********************************************
        foreach (var webfile in webpage.adx_webpage_webfile)
        {
            var cloned_webfile = webfile.Clone(); 

            //should iterate through every web file that is related to a web page, and clone it. 
            cloned_webfile.Attributes.Remove("adx_webfileid");
            cloned_webfile.Attributes.Remove("adx_websiteid");
            cloned_webfile.Attributes.Remove("adx_parentpageid");
            cloned_webfile["adx_websiteid"] = new EntityReference("adx_website", livesiteGuid);
            cloned_webfile["adx_parentpageid"] = new EntityReference("adx_webpage", clonedwebpageguid);
            cloned_webfile.EntityState = null;
            cloned_webfile.Id = Guid.NewGuid();
            Guid ClonedWebFileGuid = _service.Create(cloned_webfile);

            //*********************************** NOTE *********************************************
            foreach (var note in webfile.adx_webfile_Annotations)
            {

                var cloned_note = note.Clone();

                cloned_note.Attributes.Remove("annotationid"); // pk of note
                cloned_note.Attributes.Remove("objectid"); // set to web file guid

                cloned_note["objectid"] = new EntityReference("adx_webfile", ClonedWebFileGuid); // set the relationship between our newly cloned webfile and the note
                cloned_note.Id = Guid.NewGuid();
                cloned_note.EntityState = null;

                Guid clonednote = _service.Create(cloned_note);


                //cloned_note.Attributes.Remove("ownerid");
                //cloned_note.Attributes.Remove("owningbusinessunit");
                //cloned_note.Attributes.Remove("owningteam");
                //cloned_note.Attributes.Remove("owninguser");


            }
1 голос
/ 23 декабря 2011

Мы не используем это с динамикой, но когда нам нужна глубокая копия, мы сериализуем объект с помощью BinaryFormatter, а затем десериализуем его в новый объект, что очень похоже на то, что происходит с удаленным взаимодействием .Net.

Вот наше решение VB.Net (при желании я могу конвертировать в C #):

''' <summary>
''' This method clones all of the items and serializable properties of the current collection by 
''' serializing the current object to memory, then deserializing it as a new object. This will 
''' ensure that all references are cleaned up.
''' </summary>
''' <returns></returns>
''' <remarks></remarks>
Public Function CreateSerializedCopy(Of T)(ByVal oRecordToCopy As T) As T
    ' Exceptions are handled by the caller

    If oRecordToCopy Is Nothing Then
        Return Nothing
    End If

    If Not oRecordToCopy.GetType.IsSerializable Then
        Throw New ArgumentException(oRecordToCopy.GetType.ToString & " is not serializable")
    End If

    Dim oFormatter As New System.Runtime.Serialization.Formatters.Binary.BinaryFormatter

    Using oStream As IO.MemoryStream = New IO.MemoryStream
        oFormatter.Serialize(oStream, oRecordToCopy)
        oStream.Position = 0
        Return DirectCast(oFormatter.Deserialize(oStream), T)
    End Using
End Function
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...