Службы RIA + сторона сервера Entity Framework Insert Update Deletes - ведение журнала

Прежде всего, спасибо за любую помощь. Я использую службы ria для вставки/обновления/удаления объектов и сохранения истории этих операций. Я хочу выполнить операцию и сохранить историю за ОДИН вызов сервиса. Прямо сейчас я застрял на вставке, потому что мне нужен новый идентификатор объекта, который создается на вставке. Возможно, я все вместе использую неправильный подход (но я надеюсь, что нет). Я переопределил метод отправки и пытаюсь сохранить снимок в таблице истории, я не хочу сохранять снимок исходной версии:

    public override bool Submit( ChangeSet changeSet )
    {
        //SUBMIT FIRST SO THE OBJECT(S) HAVE AN ID
        var success = base.Submit( changeSet );
        if ( success )
            foreach ( var changeSetEntry in changeSet.ChangeSetEntries )
            {
                if ( changeSetEntry.Entity is MyBusinessEntity )
                {
                    var newBusinessEntity = (MyBusinessEntity) changeSetEntry.Entity;
                    RecordModifiedMyBusinessEntity( changeSetEntry.Operation, newBusinessEntity );
                }
            }
        return success;
    }

    private void RecordModifiedMyBusinessEntity( DomainOperation operation, MyBusinessEntity newBusinessEntity )
    {
        var hist = new BusinessEntityHistory
        {
            ChangedBy = new AuthenticationService().GetUser().FriendlyName,
            ChangedDate = DateTime.Now,
            Operation = operation.ToString(),
            BusinessEntityId = newBusinessEntity.Id,
            Group = newBusinessEntity.Group,
            Priority = newBusinessEntity.Priority,
            ....
        };
        InsertBusinessEntityHistory( hist );
        //HERE IS WHERE I WANT TO CALL SUBMIT CHANGES AGAIN, BUT 1 - IT'S NOT IN THE CHANGESET,
        //AND 2 - THE OBJECT I ALREADY INSERTED IS IN THE CHANGESET (SO IF I SUBMIT AGAIN, IT GETS 
        //INSERTED TWICE AND NO HISTORY IS SAVED.  AND 3 - I CAN'T DO THE HISTORY BEFORE BECAUSE I DON'T 
        //HAVE THE ID, AND I DON'T WANT TO DO A MAX ID + 1 BECAUSE SOMEONE ELSE MIGHT BE 
        //INSERTING INTO THE SAME TABLE
    }

person zBomb    schedule 16.08.2011    source источник


Ответы (1)


Вот решение, с которым я столкнулся:

    public override bool Submit( ChangeSet changeSet )
    {
        //submit the changes
        var success = base.Submit( changeSet );
        if ( success )
        {
            //make a new list of change set entries 
            var entries = new List<ChangeSetEntry>();
            //each change set entry needs an id (not to be confused with the entity's id)
            var maxId = 0;
            //iterate through each change and add historical snapshot.
            foreach ( var changeSetEntry in changeSet.ChangeSetEntries )
            {
                var entity = changeSetEntry.Entity;
                var operation = changeSetEntry.Operation;
                var myEntity = entity as MyEntityType;
                if ( myEntity != null )
                {
                    entries.Add( GetHistoryChangeSetEntry( ref maxId, operation, myEntity ) );
                    continue;
                }
            }
            //make new change set with historical snapshots
            var newChangeSet = new ChangeSet( entries );
            //submit the new change set
            base.Submit( newChangeSet );
        }
        return success;
    }

    private ChangeSetEntry GetHistoryChangeSetEntry( ref int maxId, DomainOperation operation, MyEntityType myEntity )
    {
        return new ChangeSetEntry
                {
                    Id = ++maxId,
                    //We are inserting this change set entry
                    Operation = DomainOperation.Insert,
                    Entity = new MyEntityTypesHistory
                                {
                                    ChangedBy = ServiceContext.User.Identity.Name,
                                    ChangedDate = DateTime.Now,
                                    //The operation performed on the original entity
                                    Operation = operation.ToString(),
                                    MyEntityId = myEntity.EntityId,
                                    MyEntityField1 = myEntity.EntityField1,
                                    MyEntityField2 = myEntity.EntityField2
                                }
                };
    }

Мне пришлось создать новый набор изменений и новые записи набора изменений для него, а также отправить изменения с новым набором изменений.

person zBomb    schedule 21.09.2011