c# - Entity Framework: Attaching an entity of type FixedAssets failed because another entity of the same type already has the same primary key value -


i trying create web api program uses ef. right now, having crud functions in controller, working creating new object, deleting object , reading object. problem comes when try update object exists in database, receiving error title. tried solutions people had problem , asked question here, nothing worked now.

here code:

the method controller:

    [httppost]     [route("updateasset")]     public httpresponsemessage updateasset(httprequestmessage request, fixedassetsview assets)     {         return createhttpresponse(request, () =>         {             httpresponsemessage response = null;              if (!modelstate.isvalid)             {                 response = request.createresponse(httpstatuscode.badrequest,                     modelstate.keys.selectmany(k => modelstate[k].errors)                           .select(m => m.errormessage).toarray());             }             else if (!service.isindatabase(assets.id))             {                 modelstate.addmodelerror("error", "couldn't find assets want update");                 response = request.createresponse(httpstatuscode.badrequest,                 modelstate.keys.selectmany(k => modelstate[k].errors)                       .select(m => m.errormessage).toarray());             }             else if (service.isindatabaseafterinventoryno(assets.inventoryno) && service.getassetidafterinventorynumber(assets.inventoryno) != assets.id)             {                 modelstate.addmodelerror("invalid object", "an assets same inventory number exists");                 response = request.createresponse(httpstatuscode.badrequest,                 modelstate.keys.selectmany(k => modelstate[k].errors)                       .select(m => m.errormessage).toarray());             }             else             {                 if (service.wasupdated(assets))                     response = request.createresponse(httpstatuscode.ok, "success");                 else                     response = request.createresponse(httpstatuscode.internalservererror);             }              return response;         });     } 

the methods use service:

    public bool isindatabase(int id)     {         return assetsrepo.findby(asset => asset.id == id).any();     }      public bool isindatabaseafterinventoryno(int inventoryno)     {         return assetsrepo.findby(asset => asset.inventoryno == inventoryno).any();     }      public int getassetidafterinventorynumber(int inventoryno)     {         return assetsrepo.findby(asset => asset.inventoryno == inventoryno).first().id;     }      public bool wasupdated(fixedassetsview assets)     {         fixedassets singleasset = mapper.map<fixedassetsview, fixedassets>(assets);         assetsrepo.edit(singleasset);         unitofwork.commit();         return true;     } 

the methods use repository:

    public virtual iqueryable<t> findby(expression<func<t, bool>> predicate)     {         return dbcontext.set<t>().where(predicate);     }      public virtual void edit(t entity)     {         dbentityentry dbentityentry = dbcontext.entry<t>(entity);         dbentityentry.state = entitystate.modified; /*here receive exception*/     } 

here dbcontext method:

    private inventorymanagementcontext datacontext;      protected inventorymanagementcontext dbcontext     {         { return datacontext ?? (datacontext = dbfactory.init()); }     } 

my dbfactory method:

    protected idbfactory dbfactory     {         get;         private set;     } 

my idbfactory interface:

public interface idbfactory : idisposable {     inventorymanagementcontext init(); } 

my inventorymanagementcontext:

public class inventorymanagementcontext : dbcontext {     // can add custom code file. changes not overwritten.     //      // if want entity framework drop , regenerate database     // automatically whenever change model schema, please use data migrations.     // more information refer documentation:     // http://msdn.microsoft.com/en-us/data/jj591621.aspx      public inventorymanagementcontext() : base("name=inventorymanagementcontext")     {         database.setinitializer<inventorymanagementcontext>(null);     }      public system.data.entity.dbset<inventorymanagement.models.inventoryobjects> inventoryobjects { get; set; }      public system.data.entity.dbset<inventorymanagement.models.fixedassets> fixedassets { get; set; }      public virtual void commit()     {         base.savechanges();     }     protected override void onmodelcreating(dbmodelbuilder modelbuilder)     {         modelbuilder.conventions.remove<pluralizingtablenameconvention>();          modelbuilder.configurations.add(new fixedassetsconfiguration());         modelbuilder.configurations.add(new inventoryobjectsconfiguration());     } } 

thank help.

i fixed problem. ones have in future, updated findby function

public virtual iqueryable<t> findby(expression<func<t, bool>> predicate) {     return dbcontext.set<t>().where(predicate).asnotracking(); } 

notice "asnotracking()" addition.


Comments

Popular posts from this blog

javascript - Create a stacked percentage column -

Optimising Firebase database by automatically overwriting data -

javascript - Angular UI-Grid customTemplate directive causing rows to load slowly/? -