gpt4 book ai didi

entity-framework - Entity Framework 和存储库模式

转载 作者:行者123 更新时间:2023-12-03 07:17:38 25 4
gpt4 key购买 nike

我想使用 Entity Framework 来持久化域实体。我的项目设置如下:-

  • UI:MVC(使用 Automapper 在域实体和 View 模型之间进行映射)
  • 领域:实体、服务、存储库接口(interface)
  • 存储库: Entity Framework (实现域层的接口(interface))。使用 Automapper 在域实体和 Entity Framework 对象之间进行映射。

这很有效,除非在我的服务中,如果我执行诸如通过检查存储库来验证项目,然后执行更新之类的操作。此操作失败,因为 Entity Framework 标识映射之前已看到该项目,我尝试再次附加它。

我可以使用如下代码解决这个问题(这会变得更通用)

        public void Update(Domain.Entities.Book entity)
{
Book newBook = _mapper.Map<Domain.Entities.Book, Book>(entity);
ObjectStateEntry cacheEntry;
if (_dataContext.ObjectStateManager.TryGetObjectStateEntry(_dataContext.CreateEntityKey("Books",newBook), out cacheEntry))
{
_dataContext.Books.ApplyCurrentValues(newBook);
}
else
{
_dataContext.Books.Attach(newBook);
_dataContext.ObjectStateManager.ChangeObjectState(newBook, EntityState.Modified);
}
_dataContext.SaveChanges();
}

问题是我发现自己必须编写相同类型的删除代码

        public void Delete(Domain.Entities.Book entity)
{
Book newBook = _mapper.Map<Domain.Entities.Book, Book>(entity);
ObjectStateEntry cacheEntry;
if (_dataContext.ObjectStateManager.TryGetObjectStateEntry(_dataContext.CreateEntityKey("Books", newBook), out cacheEntry))
{
_dataContext.ObjectStateManager.ChangeObjectState(cacheEntry.Entity, EntityState.Deleted);

}
else
{
_dataContext.Books.Attach(newBook);
_dataContext.ObjectStateManager.ChangeObjectState(newBook, EntityState.Deleted);
}
_dataContext.SaveChanges();
}

我确信一定有更好的方法来实现我想要做的事情,但我一生都无法弄清楚是什么!

关于上述方法的任何其他一般性评论将不胜感激,因为我即将在大型项目中使用它!

谢谢

罗斯

最佳答案

就像 Trailmax 所说,看起来您有多个数据上下文。我会寻找一个数据上下文。这可以通过创建通用存储库来完成。假设您在实体和存储库之间具有 1:1 的关系,本文可能会帮助您实现目标:http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/implementing-the-repository-and-unit-of-work-patterns-in-an-asp-net-mvc-application .

关于entity-framework - Entity Framework 和存储库模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11972826/

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