1

I have been able to implement Breeze into an angular application using AspNetCore based on the Breeze Temphire sample and the breeze.server.net/AspNetCore/ github samples. I am stuck trying to figure out how to implement EFContextProvider in a Unit Of Work. Referring to the Tempire Code Temphire on Github, can someone show me how to create a UnitOfWork using AspNetCore?

EFContextProvider does not exist in the following breeze libs:

  • Breeze.Core
  • Breeze.Persistence
  • Breeze.pErsistence.EFCore
  • Breeze.AspNetCore.NetCore

To be clear I would like to create the following using the AspNetCore/Breeze libs:

public class UnitOfWork
{
    private readonly EFContextProvider<TempHireDbContext> _contextProvider;

    public UnitOfWork()
    {
        _contextProvider = new EFContextProvider<TempHireDbContext>();

        StaffingResources = new Repository<StaffingResource>(_contextProvider.Context);
        Addresses = new Repository<Address>(_contextProvider.Context);
        AddressTypes = new Repository<AddressType>(_contextProvider.Context);
        PhoneNumbers = new Repository<PhoneNumber>(_contextProvider.Context);
        PhoneNumberTypes = new Repository<PhoneNumberType>(_contextProvider.Context);
        Rates = new Repository<Rate>(_contextProvider.Context);
        RateTypes = new Repository<RateType>(_contextProvider.Context);
        Skills = new Repository<Skill>(_contextProvider.Context);
        States = new Repository<State>(_contextProvider.Context);
        WorkExperienceItems = new Repository<WorkExperienceItem>(_contextProvider.Context);

        StaffingResourceListItems = new StaffingResourceListItemRepository(_contextProvider.Context);
    }

    public IRepository<StaffingResource> StaffingResources { get; private set; }
    public IRepository<Address> Addresses { get; private set; }
    public IRepository<AddressType> AddressTypes { get; private set; }
    public IRepository<PhoneNumber> PhoneNumbers { get; private set; }
    public IRepository<PhoneNumberType> PhoneNumberTypes { get; private set; }
    public IRepository<Rate> Rates { get; private set; }
    public IRepository<RateType> RateTypes { get; private set; }
    public IRepository<Skill> Skills { get; private set; }
    public IRepository<State> States { get; private set; }
    public IRepository<WorkExperienceItem> WorkExperienceItems { get; private set; }

    public IStaffingResourceListItemRepository StaffingResourceListItems { get; private set; }

    public SaveResult Commit(JObject changeSet)
    {
        return _contextProvider.SaveChanges(changeSet);
    }
}

}

Could it be as simple as the following?

 private readonly EFPersistenceManager<DictionaryPortalContext> _contextProvider;

Thanks!

MrTouya
  • 656
  • 6
  • 19

1 Answers1

0

Pretty close.

We usually create a separate class so that you have somewhere to add 'BeforeSaveEntities' and 'AfterSaveEntities' methods.

public class MyPersistenceManager : EFPersistenceManager<DictionaryPortalContext> {
    public MyPersistenceManager (DictionaryPortalContext dbContext) : base(dbContext) { 
   // PM methods here.
 }

and then

  [Route("breeze/[controller]/[action]")]
  [BreezeQueryFilter]
  public class MyController : Controller {
    private MyPersistenceManager PersistenceManager;

    // called via DI 
    public MyController(NorthwindIBContext_CF context) {
      PersistenceManager = new MyPersistenceManager(context);
    }


    [HttpGet]
    public IActionResult Metadata() {
      return Ok(PersistenceManager.Metadata());
    }
    [HttpPost]
    public SaveResult SaveChanges([FromBody] JObject saveBundle) {
      return PersistenceManager.SaveChanges(saveBundle);
    }

    ...
  }

Hope this helps.

Jay Traband
  • 17,053
  • 1
  • 23
  • 44