c# - How to Safely and Efficiently Insert/Update Records in Entity Framework 6 for Changed-Only Fields? -


i trying safely insert/update entity using entity framework 6. instead of using addorupdate method not thread-safe , not recommended production, figured first attempt insert entity in db , if fails due primary key collision, update instead. used database first model. entity user primary key = userid , other fields nullable. need update scenario return updated entity post'ed values on corresponding values leaving others in db.

for example, user entity has 20 properties. post may update small subset of these properties given userid. need returned user show updated user.

for example, first post insert new user userid = x1 this:

{ "userid": "x1", "firstname": "user first name", "lastname": "user last name", "email": "email@company.com" }

my 2nd post update user update email this:

{ "userid": "x1", "email": "different_email@xyz.com" }

i need 2nd post show me original firstname , lastname set in first insert post not null. see original firstname , lastname in db not show in 2nd post's response.

questions are: (1) doing wrong here? (2) making 2-3 queries db. there cleaner way reduce round trips db without compromising on thread-safety , concurrency?

    private ucbcontext db = new ucbcontext();     private bool insertuser(ref user user)     {         try         {             db.users.add(user);             db.savechanges();             return (true);         }         catch { }         return (false);     }      private bool updateuser(ref user user)     {         try         {             db.users.attach(user);             dbentityentry entry = db.entry(user);              foreach (var propertyname in entry.currentvalues.propertynames)             {                 var value = entry.currentvalues[propertyname];                 entry.property(propertyname).ismodified = (propertyname != "userid" && value != null);             }              db.savechanges();             return (true);         }         catch { }         return (false);     }      // post: api/users = insert/update user     [responsetype(typeof(user))]     public ihttpactionresult postuser(user user)     {         if (!modelstate.isvalid){ return badrequest(modelstate); }          bool ok = insertuser(ref user);         if (!ok) { ok = updateuser(ref user); }          user dbuser = db.users.find(user.userid);         if(dbuser == null) { return notfound(); }          return ok(dbuser);     }  public partial class user {     public user()     {         this.logins = 0;     }      public string userid { get; set; }     public string firstname { get; set; }     public string lastname { get; set; }     public string email { get; set; }     public nullable<int> logins { get; set; } } 

the second last line returns original user object ... should do:

return ok(dbuser); 

instead of:

return ok(user); 

just add bit more color this- remember when pass user object insertuser or updateuser, you're passing copy of it. why need reload based on userid, , return refreshed user object.


Comments

Popular posts from this blog

java - Run spring boot application error: Cannot instantiate interface org.springframework.context.ApplicationListener -

reactjs - React router and this.props.children - how to pass state to this.props.children -

Excel VBA "Microsoft Windows Common Controls 6.0 (SP6)" Location Changes -