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

其中有几个选项:

  • 让不同的服务传递分离的实体(其实体),甚至可能是非实体的DTO,然后让每个服务将它们转换为其实体(或使用主键)。

    每个服务都可以创建自己的内容,并使用自己的EDMX或共享的EMDX(甚至多个EDMX)

  • 如果服务使用相同的EDMX,那么将相同的上下文注入到它们中(您可以将其包装在后面并进行接口,这样它们就不会公开EF)

  • 如果服务不使用相同的EDMX,则:

    3.1。使用选项1,为不同的服务(或DTO)使用不同的实体

    您可以使用不同的实体在EDMX之间“共享”表,或者使用视图“来自外部域的表”将表的只读版本反映到其他域

    3.2。通过将EDMX合并为一个大EDMX来创建主EDMX(有关详细信息,请参阅)


  • 更改仅在调用context.AcceptChanges()时应用,因此您可以将更改保存到多个上下文中,然后在所有保存完成后接受每个上下文中的更改。

    其中有几个选项:

  • 让不同的服务传递分离的实体(其实体),甚至可能是非实体的DTO,然后让每个服务将它们转换为其实体(或使用主键)。

    每个服务都可以创建自己的内容,并使用自己的EDMX或共享的EMDX(甚至多个EDMX)

  • 如果服务使用相同的EDMX,那么将相同的上下文注入到它们中(您可以将其包装在后面并进行接口,这样它们就不会公开EF)

  • 如果服务不使用相同的EDMX,则:

    3.1。使用选项1,为不同的服务(或DTO)使用不同的实体

    您可以使用不同的实体在EDMX之间“共享”表,或者使用视图“来自外部域的表”将表的只读版本反映到其他域

    3.2。通过将EDMX合并为一个大EDMX来创建主EDMX(有关详细信息,请参阅)


  • 更改仅在调用context.AcceptChanges()时应用,因此您可以将更改保存到多个上下文中,然后在所有保存完成后接受每个上下文中的更改。

    我想我已经回答了您的问题,如果缺少什么请告诉我。我想我已经回答了您的问题,如果缺少什么请告诉我。您好,谢谢回复。是的,我首先使用代码,所以所有服务都是相同的模式和相同的实例。我使用unity,注入相关的工作单元将是完美的,但我不确定如何做到这一点,因为依赖项被注入到每个服务层构造函数中——在解析接口时是否可能注入对象?我对Unity还不太熟悉,无法回答这个问题。试着问另一个带标签的问题。然而,我怀疑,如果配置足够的话,所有依赖注入框架都可以做任何事情。是的,我首先使用代码,所以这是相同的模式