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
Post a Comment