c# - in Entity framework, how to call a method on Entity before saving -
c# - in Entity framework, how to call a method on Entity before saving -
below have created demo entity demonstrate iam looking for
public class user : ivalidatableobject { public string name{get;set;} [required] public datetime creationdate{get;set;} public datetime updatedondate{get;set;} public ienumerable<validationresult> validate(validationcontext validationcontext) { if(name="abc") { yield homecoming new validationresult("please take other name abc", new[] { "name" }); } } }
i implementing ivalidatableobject
interface create entity selfvalidating.
now create new user iam doing this
user u= new user(); u.name="some name"; u.creationdate=datetime.now dbcontext.users.add(u); dbcontext.savechanges();
iam planning shift u.creationdate=datetime.now;
code within user class. , implement interface provides method executed before saving , after validating
// class construction iam looking public class user : ivalidatableobject,imycustominterface { //rest codes above class public void mymethod(whatever) { //this method gets called after validate() , before save if(datacontext.entry<user>(this).state == system.data.entitystate.added) { //add creation date_time this.creationdate=datetime.now; //set more defaults } if(datacontext.entry<user>(this).state == system.data.entitystate.modified) { //update updation time this.updatedondate=datetime.now; } } }
now create new user have below, note didnt added date property time, class automatically
user u= new user(); u.name="some name"; dbcontext.users.add(u); dbcontext.savechanges();
to update user, updatedondate
property automatically updated class
user u= getuserfromsomewhere(); u.name="updated name"; datacontext.entry<user>(u).state = system.data.entitystate.modified; dbcontext.savechanges();
my question: there existing interface provides method gets called before save , after validate or other ways of doing this, may not knowing.
or if create custom interface how can create method executed in order looking for
i have identical situation , manage handling savingchanges event on context.
first create interface defines timestamping operations:
public interface ihastimestamp { void dotimestamp(); }
then implement interface in entities:
public class user : ihastimestamp ( public void dotimestamp() { if(datacontext.entry<user>(this).state == system.data.entitystate.added) { //add creation date_time this.creationdate=datetime.now; } if(datacontext.entry<user>(this).state == system.data.entitystate.modified) { //update updation time this.updatedondate=datetime.now; } } }
the final step register savingchanges handler , implement it.
public partial class myentities { partial void oncontextcreated() { // register handler savingchanges event. this.savingchanges += new eventhandler(context_savingchanges); } // savingchanges event handler. private static void context_savingchanges(object sender, eventargs e) { // validate state of each entity in context // before savechanges can succeed. foreach (objectstateentry entry in ((objectcontext)sender).objectstatemanager.getobjectstateentries(entitystate.added | entitystate.modified)) { if (!entry.isrelationship && (entry.entity ihastimestamp)) { (entry.entity ihastimestamp).dotimestamp(); } } } }
c# entity-framework ef-code-first entity-framework-4.1
Comments
Post a Comment