验证对象是否已在Entity Framework上下文中

时间:2010-12-09 22:10:31

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

我在使用EF4时遇到问题,当我试图验证对象是否已经在Entity Framework上下文中时。

我有以下代码

        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 [Unique constraints]中获得异常,即使在通过我的验证插入之后,也保证名称是唯一的。

有人有任何想法吗?

2 个答案:

答案 0 :(得分:9)

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

只有在您执行ctx.SaveChanges()后,才会将更改保留到底层商店。

您正在编写的查询是针对数据库的,并且该更改尚未保留。

因此,如果您在之后执行 {{1>},那么计数将按预期执行。

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

答案 1 :(得分:1)

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