【问题标题】:Verify if object is already inside Entity Framework context验证对象是否已经在实体框架上下文中
【发布时间】:2010-12-09 22:10:31
【问题描述】:

我在使用 EF4 时遇到问题,我试图验证对象是否已经在实体框架上下文中。

我下面有这段代码

        var entityName = Entity4Test + Guid.NewGuid();

        using( var ctx = new EnviroDataContext() )
        {
            var etc = new Entity
            {
                Name = entityName
            };

            ctx.Entity.AddObject( etc );

                var q = from p in ctx.Entity
                        where p.Name == entityName
                        select p;

// Why 'q.ToList().Count == 0'?

                ctx.SaveChanges();
            }

我的问题是,为什么我插入后的搜索结果是空的?

我知道数据会在“SaveChanges”之后持久化,但如果我需要“查询”我的实体内存数据怎么办。

扩展问题

我有一个业务规则,通过添加 1 个项目 A,触发其他实体 B 的插入。 问题是,我有验证规则,在插入 B 时,t A 必须已经存在。

因为所有这些操作都是在“SaveChanges”之前进行的,所以我收到一个错误,即 EntityA 不存在。

其他情况,我有一个在表格中唯一的名称字段。 如果我尝试运行 AddEntityName("bla") 两次,然后运行 ​​'SaveChanges',我会从 DB [唯一约束] 中得到一个异常,即使在通过插入验证之后,也可以保证名称是唯一的。

有人知道吗?

【问题讨论】:

    标签: .net entity-framework entity-framework-4


    【解决方案1】:

    当您执行 .AddObject 时,它会将其添加到 EF 的内部“图形”(内存)中,处于“已添加”的挂起状态。

    只有在您执行ctx.SaveChanges() 之后,更改才会持久保存到底层存储中。

    您正在编写的查询是针对数据库的,更改尚未持久化。

    因此,如果您在执行查询 之后执行ctx.SaveChanges(),则计数将符合预期。

    附带说明,如果您想查看一个实体是否已经在图表中(例如,在您“附加”之前),请阅读 ObjectStateManager.TryGetObjectStateEntry

    【讨论】:

    • 我明白你在说什么,但问题是,如果这种行为有意义,你是否有暗示更多插入和验证的业务规则?
    • @muek - 抱歉,不明白你的问题。什么意思?
    • 对,所以您尝试查询“内存”数据 - 例如图表。好吧,你不能:) 正如我所说,你可以使用TryGetObjectStateEntry 来查看图中的实体,但这通常在尝试Attach 实体时使用,所以你不会得到“对象键已经存在”错误。我仍然不明白你具体想要达到的目标。 究竟你想在这个特定的方法中做什么?
    • 你没有给我想要的答案,但我认为你给了我可能的答案。谢谢
    【解决方案2】:

    我没有使用过 EF4,但使用了以前的版本,所以我不知道他们是否对 EF4 有不同的期望。看起来您正在尝试在实际提交之前在数据库中搜索资产。你应该先调用 SaveChanges 然后搜索它。

    【讨论】:

      猜你喜欢
      • 2011-04-14
      • 2014-03-19
      • 1970-01-01
      • 1970-01-01
      • 2012-07-10
      • 2018-08-11
      • 2016-11-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多