Добавить объект отношения в общем / абстрактном виде - PullRequest
0 голосов
/ 13 мая 2009

Я пытаюсь написать метод WCF, который получит отсоединенный объект EntityObject от клиента и сможет сказать, какие свойства и какие отношения были изменены для этого объекта, сравнивая его с тем, что уже находится в контексте. Конечно, если эта сущность является новой сущностью или одна из ее взаимосвязей была добавлена ​​/ удалена / изменена, она также должна признать это и действовать соответственно.

Я уже могу распознать, являются ли отношения сущности новыми, но, похоже, не может правильно их добавить. -При каждом подходе я пытаюсь получить другое исключение.

Вот метод, который я использую для обновления отсоединенного объекта:

public static void AttachUpdated(this ObjectContext context, EntityObject objectDetached)
{
    if (objectDetached.EntityState == EntityState.Detached)
    {
        object currentEntityInDb = null;

        if (context.TryGetObjectByKey(objectDetached.EntityKey, out currentEntityInDb))
        {
            context.ApplyPropertyChanges(objectDetached.EntityKey.EntitySetName, objectDetached);
            //Apply property changes to all referenced entities in context 
            context.ApplyReferencePropertyChanges((IEntityWithRelationships)objectDetached,
                                                  (IEntityWithRelationships)currentEntityInDb); //Custom extensor method 
        }
        else
        {
            //The entity should be added
            //?????
        }
    }
}

И этот метод я использую для обновления отношений сущности:

public static void ApplyReferencePropertyChanges(this ObjectContext context,
                                                         IEntityWithRelationships newEntity,
                                                         IEntityWithRelationships oldEntity)
{
    foreach (var oldRelatedEnd in oldEntity.RelationshipManager.GetAllRelatedEnds())
    {
        var oldRef = oldRelatedEnd as EntityReference;

        if (oldRef != null)
        {
            // this related end is a reference not a collection 
            var newRef = newEntity.RelationshipManager.GetRelatedEnd(oldRef.RelationshipName, oldRef.TargetRoleName) as EntityReference;
            if (newRef.EntityKey != null)
            {
                oldRef.EntityKey = newRef.EntityKey;
            }
            else
            {   
                //When oldRed is a 1:Many relationship
                //newRef is an EntityReference<TEntity> object
                EntityObject entity = newRef.GetType().GetProperty("Value").GetValue(newRef, null) as EntityObject;
                oldRef.EntityKey = entity.EntityKey;
            }
        }
        else
        {
            IRelatedEnd newRelatedEnd = newEntity.RelationshipManager.GetRelatedEnd(oldRelatedEnd.RelationshipName, oldRelatedEnd.TargetRoleName);
            foreach (IEntityWithRelationships e in newRelatedEnd)
            {
                if (!oldRelatedEnd.Contains((e as IEntityWithKey).EntityKey))
                {
                    //this is a new relation and it needs to be added.
                    //???????
                }
                else
                {
                    //Find out if relation was modified - and update it if needed
                    //????????
                }
            }
            IEnumerable entities = oldRelatedEnd as IEnumerable;

        }
    }
}

Как это должно быть реализовано?

Пожалуйста, помогите: (

Ответы [ 3 ]

0 голосов
/ 11 июля 2009

Я не уверен, чего вы хотите достичь - если вы хотите сохранить изменения на стороне сервера, вы можете использовать ADO .Net Data Services. Это тот случай?

0 голосов
/ 12 июля 2009

См. Персей :

Персей это небольшой проект, предназначенный для изучить способы обмена графиками Entity Framework объекты через веб-сайт WCF Сервисы. Ключевая часть проекта это EntityBag, который хранит график сущностей вместе с отслеживанием изменений Информация. Здесь надеются, что никто не будет использовать это для хранения и транспортировки что-то противное, как голова Медузы. ; -)

0 голосов
/ 27 июня 2009

Откуда исходит ваш ObjectContext? (Я предполагаю, что это ваша база данных Entity Framework)

Здесь могут быть две проблемы:

Во-первых, я не думаю, что ObjectContext является сериализуемым, поэтому, если вы отправляете его клиенту, а затем отправляете обратно, вы получите ошибку.

Во-вторых, если вы храните ObjectConext на сервере, объекты сервера по умолчанию используются для каждого вызова, а не для сеанса, поэтому вы будете пытаться связать вашу сущность с новым ObjectContext.

В наших проектах мы сопоставляем объекты Entity Framework с объектами передачи данных, чтобы затем передавать их через WCF. То, что вы пытаетесь сделать, может быть проще (возможно?) В следующей версии Entity Framework.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...