gpt4 book ai didi

entity-framework - Entity Framework ObjectContext 是否正确实现了工作单元模式?

转载 作者:行者123 更新时间:2023-12-04 07:22:40 25 4
gpt4 key购买 nike

Entity Framework 4 - STE - 简单的数据库,单表博客有 BlogID PK 列...

var samplesDbEntities = new SamplesDBEntities();
var blogId = Guid.NewGuid();
samplesDbEntities.Blogs.AddObject(new Blog() { BlogID = blogId });
var objectSetResult = samplesDbEntities.Blogs
.Where(p => p.BlogID == blogId)
.SingleOrDefault();

(代码执行结果 => objectSetResult == null 在最后一行之后)

AFAIK,ObjectContext 是 UoW 模式的实现,在这种情况下,我想我应该从 ObjectSet (Repository) 取回结果,只是“标记为 transient ”
有人能解释一下我做错了什么以及为什么 objectSetResult 在这里有空值吗?

(是的,我知道 ObjectStateManager,但对我来说它更像是针对上面提到的架构问题的补丁)

最佳答案

你需要打电话

samplesDbEntities.SaveChanges();

在重新查询对象之前。
var samplesDbEntities = new SamplesDBEntities(); 
var blogId = Guid.NewGuid();
samplesDbEntities.Blogs.AddObject(new Blog() { BlogID = blogId });

samplesDbEntities.SaveChanges();

var objectSetResult = samplesDbEntities.Blogs
.Where(p => p.BlogID == blogId)
.SingleOrDefault();

更新

您没有在 objectSetResult 中恢复添加的用户的原因是调用 IQueryable 对象的 SingleOrDefault 方法会导致数据库查询(根据“where”条件等生成实际的 SQL 查询字符串),并且由于该对象(还)不在数据库中,它不会被返回。
但是,新对象附加到上下文,并且它的 EntityState 设置为“已添加”。根据 MSDN,处于已添加状态的对象在 ObjectStateEntry 中没有原始值。对象上下文中对象的状态由 ObjectStateManager 管理。所以如果你想检查对象是否真的被附加了,你可以通过调用 GetObjectStateEntry 来获取它:
var samplesDbEntities = new SamplesDBEntities();
Blog blog = new Blog() { BlogID = Guid.NewGuid() };
samplesDbEntities.Blogs.AddObject("Blogs", blog);

Blog addedBlog = (Blog)context.ObjectStateManager.GetObjectStateEntry(blog).Entity;

另请注意,检索到的对象的 EntityState 是“已添加”。

总而言之 - 关于您关于它是否是 UnitOfWork 的正确实现的最初问题,我不明白为什么。它确实维护一个对象列表并跟踪更改等。但是,您遇到的问题与您从底层提供程序获取数据的事实有关,而不是从当前附加到语境。

关于entity-framework - Entity Framework ObjectContext 是否正确实现了工作单元模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3118769/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com