c# - Eager loading using the UserManager -
so have created user service inherits usermanager , looks this:
/// <summary> /// service handling users /// </summary> public class userservice : usermanager<user> { /// <summary> /// default constructor /// </summary> /// <param name="store">the user repository</param> public userservice(iuserstore<user> store) : base(store) { // allow user service use email instead of usernames this.uservalidator = new uservalidator<user>(this) { allowonlyalphanumericusernames = false }; } /// <summary> /// static method creates new instance of user service /// </summary> /// <param name="options">any options should supplied</param> /// <param name="context">the owin context</param> /// <returns>the user service</returns> public static userservice create(identityfactoryoptions<userservice> options, iowincontext context) { // our current database context var dbcontext = context.get<databasecontext>(); // create our service var service = new userservice(new userstore<user>(dbcontext)); // allow user service use email instead of usernames service.uservalidator = new uservalidator<user>(service) { allowonlyalphanumericusernames = false }; // assign our email service our user service service.emailservice = new emailservice(); // our data protection provider var dataprotectionprovider = options.dataprotectionprovider; // if our data protection provider not nothing if (dataprotectionprovider != null) { // set our token provider service.usertokenprovider = new dataprotectortokenprovider<user>(dataprotectionprovider.create("asp.net identity")) { // code email confirmation , reset password life time tokenlifespan = timespan.fromhours(6) }; } // return our service return service; } }
but have disabled lazyloading in dbcontext. so, have issue. user can have centers, belong company therefore lookup table created have mapped in dbcontext this:
// create lookup tables modelbuilder.entity<center>() .hasmany(m => m.users) .withmany(m => m.centers) .map(m => { m.mapleftkey("centerid"); m.maprightkey("userid"); m.totable("usercenters"); });
so, need access user's centers doesn't seem identity framework supports eager loading. has found issue before , know how can use eagerloading usermanager?
cheers, /r3plica
damn, easy solve. usermanager exposes users dbset iqueryable can add include there, created funciton:
/// <summary> /// gets users /// </summary> /// <param name="includes">optional parameter eager loading related entities</param> /// <returns>an list of users</returns> public iqueryable<user> getall(params string[] includes) { // our user dbset var users = base.users; // each include, include in query foreach (var include in includes) users = users.include(include); // return our result return users; }
and in controllers, did this:
/// <summary> /// gets centers assigned user /// </summary> /// <param name="userid">the id of user</param> /// <returns>all centers user</returns> [httpget] [route("", name = "getcentersbyuser")] public ihttpactionresult get(string userid) { // our user var user = this.userservice.getall("centers").where(m => m.id.equals(userid, stringcomparison.ordinalignorecase)).singleordefault(); // if user doesn't exist, throw error if (user == null) return badrequest("could not find user."); // return our centers return ok(user.centers.select(m => this.modelfactory.create(m))); }
Comments
Post a Comment