Entity Framework - проблема с отдельным обновлением - PullRequest
1 голос
/ 21 января 2009

Хорошо, я пытаюсь использовать это пользовательское расширение для обновления сущности. Прямо сейчас он должен обновить все свойства, а затем все связанные с ним концы (ссылки). Проблема в том, что у сущности с изменениями действительно есть связанный конец с ключом сущности, который является действительным и правильным (проверено в отладчике его там). Когда RelationshipManager получает его, ключ становится пустым. Кто-нибудь видит что-то не так с этим кодом?

public static void ApplyChanges(this ObjectContext context, EntityObject entityWithChanges)
    {
        if (entityWithChanges.EntityState == EntityState.Detached)
        {
            object entityCurrentlyInDB = null;

            if (context.TryGetObjectByKey(entityWithChanges.EntityKey, out entityCurrentlyInDB))
            {
                context.ApplyPropertyChanges(entityWithChanges.EntityKey.EntitySetName, entityWithChanges);

                foreach (var relatedEnd in ((IEntityWithRelationships)entityCurrentlyInDB).RelationshipManager.GetAllRelatedEnds())
                {
                    var oldRef = relatedEnd as EntityReference;

                    if (oldRef != null)
                    {
                        var newRef =
                            ((IEntityWithRelationships)entityWithChanges).RelationshipManager
                            .GetRelatedEnd(oldRef.RelationshipName, oldRef.TargetRoleName) as EntityReference;
                        oldRef.EntityKey = newRef.EntityKey;
                    }
                }
            }
            else
            {
                throw new ObjectNotFoundException();
            }

        }
    }

Это просто модифицированная версия того, что я нашел Здесь

Ценю помощь.

UPDATE: Это метод обновления

public static void UpdateTemplate(Template template)
    {
        using (TheEntities context = new TheEntities())
        {
            context.ApplyChanges(template);
            try
            {
                context.SaveChanges();
            }
            catch (OptimisticConcurrencyException)
            {
                context.Refresh(RefreshMode.ClientWins, template);
                context.SaveChanges();
            }

            context.RemoveTracking(template);
        }
    }

Это модульный тест:

[TestMethod]
    public void CanUpdateATemplate()
    {
        Template template = new Template();
        template.Name = "Test";
        template.Description = "Test";

        TemplateType type = TemplateManager.FindTemplateTypeByName("Test");

        if (type == null)
        {
            type = new TemplateType();
            type.Name = "Test";
        }

        template.TemplateType = type;

        TemplateManager.AddTemplate(template);

        template = TemplateManager.FindTemplateByID(template.TemplateID);

        Assert.IsNotNull(template);

        type = TemplateManager.FindTemplateTypeByName("Round");

        if (type == null)
        {
            type = new TemplateType();
            type.Name = "Round";
        }

        template.TemplateType = type;

        TemplateManager.UpdateTemplate(template);

        template = TemplateManager.FindTemplateByID(template.TemplateID);

        Assert.IsNotNull(template);
        Assert.IsTrue(template.TemplateType.Name == "Round");

        TemplateManager.DeleteTemplate(template);

        template = TemplateManager.FindTemplateByID(template.TemplateID);

        Assert.IsNull(template);
    }

1 Ответ

1 голос
/ 21 января 2009

Это просто невозможно из-за того, как Detach работает в EF.

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

Проблема в том, что в тот момент, когда вы возвращаете объект после вызова функции Detach, вы теряете все данные отношений. Я нашел несколько статей о написании менеджеров графов для каждой сущности, но я обнаружил, что такая вещь, как EF, должна быть потрачена впустую (предположительно, это будет в v2).

EF просто не готов к развертыванию N-уровня.

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