我在使用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]中获得异常,即使在通过我的验证插入之后,也保证名称是唯一的。
有人有任何想法吗?
答案 0 :(得分:9)
执行.AddObject
时,它会将其添加到EF的内部“图形”(内存)中,处于待定状态“已添加”。
只有在您执行ctx.SaveChanges()
后,才会将更改保留到底层商店。
您正在编写的查询是针对数据库的,并且该更改尚未保留。
因此,如果您在之后执行 {{1>},那么计数将按预期执行。
在旁注中,如果您想查看某个实体是否已经在图表中(例如在“附加”之前),请阅读 ObjectStateManager.TryGetObjectStateEntry 。
答案 1 :(得分:1)
我没有使用EF4,但使用过以前的版本,所以我不知道它们在EF4中是否有不同的期望。看起来您在实际提交之前尝试在数据库中搜索资产。您应首先调用SaveChanges然后搜索它。