Entity framework 实体框架存储库设计,多级循环中的多个IUnitOfWork实例
我正在使用实体框架和存储库以及工作单元设计模式 有时在我的工作单位,我会打其他电话到不同的服务 该服务反过来又在创建自己的工作单元实例,例如:Entity framework 实体框架存储库设计,多级循环中的多个IUnitOfWork实例,entity-framework,design-patterns,entity-framework-4,repository,unit-of-work,Entity Framework,Design Patterns,Entity Framework 4,Repository,Unit Of Work,我正在使用实体框架和存储库以及工作单元设计模式 有时在我的工作单位,我会打其他电话到不同的服务 该服务反过来又在创建自己的工作单元实例,例如: ISettingsService settingsService = UnityContainer.Resolve<ISettingService>(); using (IUnitOfWork unitOfWork = UnitOfWorkFactory.CreateUnitOfWork()) { List<Company>
ISettingsService settingsService = UnityContainer.Resolve<ISettingService>();
using (IUnitOfWork unitOfWork = UnitOfWorkFactory.CreateUnitOfWork())
{
List<Company> companies = unitOfWork.CompaniesRepository.GetAll();
foreach(Company company in companies)
{
settingsService.SaveSettings(company, "value to set");
company.Processed = DateTime.UtcNow();
}
unitOfWork.Save();
}
// ISettingsService.SaveSettings code in another module...
ISettingsService.SaveSettings(Company company, string value)
{
using (IUnitOfWork unitOfWork = UnitOfWorkFactory.CreateUnitOfWork())
{
Setting setting = new Setting();
setting.CompanyID = company.CompanyID;
setting.SettingValue = value;
unitOfWork.Insert(setting);
unitOfWork.Save();
}
}
ISettingsService设置服务=UnityContainer.Resolve();
使用(IUnitOfWork unitOfWork=UnitOfWorkFactory.CreateUnitOfWork())
{
列出公司=unitOfWork.CompanyRepository.GetAll();
foreach(公司中的公司)
{
设置服务保存设置(公司,“要设置的值”);
company.Processed=DateTime.UtcNow();
}
unitOfWork.Save();
}
//ISettingsService.SaveSettings代码位于另一个模块中。。。
ISettingsService.SaveSettings(公司,字符串值)
{
使用(IUnitOfWork unitOfWork=UnitOfWorkFactory.CreateUnitOfWork())
{
设置=新设置();
setting.CompanyID=company.CompanyID;
setting.SettingValue=值;
插入(设置);
unitOfWork.Save();
}
}
上面的代码确实有效,但我必须显式引用ID,而不是附加company对象(它会抛出一个错误,因为它已经被其他服务中的其他工作单元跟踪)
据我所知,我看到了三种情况:
1) 将代码原封不动地用于服务层创建自己的工作单元实例,对其他实体的任何其他引用都是在主键的基础上完成的(设置值的过程应通过主键对象值传递,即int customerID)
坏的一面是可能会对数据库进行更多的点击,如果实体主键类型发生更改,我将需要更改ID字段的所有服务层引用。
__
2) 让服务层接受实体对象作为引用。这会很好,因为我可以传递对象
不好的一面是,不能从任何其他上下文引用实体,必须将实体附加到将使用它的上下文。在循环中,实体很可能已经被附加。
__
3) 将工作单元实例化传递给其他服务层,以便它们可以使用现有的工作单元,而不是实例化自己的工作单元
除了必须传递一个工作单元引用之外,不确定这有什么缺点,优点是能够引用对象,而不必附加对象,或者担心对象是否已经附加。
__
总之,我需要对一种访问设计进行标准化,并希望得到关于我应该选择哪种访问设计的建议
此外,我是否需要关注事务,或者EntityFramework与工作单元设计模式是否隐式实现了一种事务处理形式,因为更改仅在context.Save()上提交,还是我弄错了
谢谢
Chris其中有几个选项:
每个服务都可以创建自己的内容,并使用自己的EDMX或共享的EMDX(甚至多个EDMX)
更改仅在调用context.AcceptChanges()时应用,因此您可以将更改保存到多个上下文中,然后在所有保存完成后接受每个上下文中的更改。其中有几个选项:
每个服务都可以创建自己的内容,并使用自己的EDMX或共享的EMDX(甚至多个EDMX)
更改仅在调用context.AcceptChanges()时应用,因此您可以将更改保存到多个上下文中,然后在所有保存完成后接受每个上下文中的更改。我想我已经回答了您的问题,如果缺少什么请告诉我。我想我已经回答了您的问题,如果缺少什么请告诉我。您好,谢谢回复。是的,我首先使用代码,所以所有服务都是相同的模式和相同的实例。我使用unity,注入相关的工作单元将是完美的,但我不确定如何做到这一点,因为依赖项被注入到每个服务层构造函数中——在解析接口时是否可能注入对象?我对Unity还不太熟悉,无法回答这个问题。试着问另一个带标签的问题。然而,我怀疑,如果配置足够的话,所有依赖注入框架都可以做任何事情。是的,我首先使用代码,所以这是相同的模式