.net 验证对象是否已在实体框架上下文中

.net 验证对象是否已在实体框架上下文中,.net,entity-framework,entity-framework-4,.net,Entity Framework,Entity Framework 4,我在使用EF4时遇到了一个问题,当时我试图验证对象是否已经在实体框架上下文中 我有下面的代码 var entityName = Entity4Test + Guid.NewGuid(); using( var ctx = new EnviroDataContext() ) { var etc = new Entity { Name = entityName

我在使用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时,ta必须已经存在

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

其他情况下,我有一个表上唯一的名称字段。 如果我试着运行AddEntityName(“bla”)两次,然后运行“SaveChanges”,我会从DB[Unique constraints]中得到一个异常,即使在通过了插入验证之后,这也可以保证名称是唯一的


有人知道吗?

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

当您执行
.AddObject
时,它会在挂起状态“Added”中将其添加到EF的内部“graph”(内存)

只有执行了
ctx.SaveChanges()
之后,更改才会持久化到基础存储中

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

因此,如果在执行
ctx.SaveChanges()
之后执行查询,则计数将与预期的一样


另一方面,如果您想查看一个实体是否已经在图中(例如,在“附加”之前),请阅读

我理解您的意思,但问题是,如果这种行为有意义,您是否拥有暗示更多插入和验证的业务规则?@muek-对不起,我不理解您的问题。你的意思是什么?对,那么你试图查询“内存”数据-例如图形。嗯,您不能:)正如我所说,您可以使用
TryGetObjectStateEntry
查看图形中的实体,但这通常是在尝试
附加
实体时使用的,因此不会出现“对象键已存在”错误。我还是不明白你到底想达到什么目的。你到底想用这种方法做什么?你没有给我我想要的答案,但我认为你给了我一个可能的答案。谢谢