【问题标题】:Entity Framework - Detached Update issue实体框架 - 分离更新问题
【发布时间】:2009-01-21 17:47:37
【问题描述】:

好的,我正在尝试使用此自定义扩展来执行实体更新。现在它应该更新所有属性,然后更新其所有相关端(引用)。问题是即使发生更改的实体确实具有与有效且正确的实体密钥相关的结束(在调试器中验证)。当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();
            }

        }
    }

这只是我发现的修改版本 Here

感谢您的帮助。

更新: 这是更新方法

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);
    }

【问题讨论】:

    标签: c# entity-framework


    【解决方案1】:

    由于 Detach 在 EF 中的工作方式,这根本不可能。

    我发现,如果我自己添加关键信息,我可以让通用调用生效,甚至可以保存它。

    问题在于,当您在对实体调用 Detach 后返回实体时,您会丢失所有关系数据。我发现了一些关于为每个实体编写图形管理器的文章,但我发现像 EF 一样浪费应该做这些事情(据说它会在 v2 中)。

    EF 还没有为 N 层部署做好准备。

    【讨论】:

      猜你喜欢
      • 2010-10-02
      • 2011-10-21
      • 2015-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多