asp.net mvc 3 - How to use a string as a primary key in MVC 3 Entity Framework 4.1 Code First? -
asp.net mvc 3 - How to use a string as a primary key in MVC 3 Entity Framework 4.1 Code First? -
i'm using latest , greatest entity framework code first , i'm running scenario want 1 of classes utilize string primary key. had manually add together key create view (by default treats identity). however, when seek create new myaccount, error below. i'm using mvc scaffolder repository pattern build myaccountcontroller. wisdom seek great appreciation.
model:public class myaccount { [key, required, maxlength(80), display(name = "user name")] public string username { get; set; } [required, datatype(datatype.emailaddress), maxlength(100), display(name = "email address")] public string email { get; set; } } view: <% using (html.beginform()) { %> <%: html.validationsummary(true) %> <legend>myaccount</legend> <div class="editor-label"> <%: html.labelfor(model => model.username) %> </div> <div class="editor-field"> <%: html.editorfor(model => model.username) %> <%: html.validationmessagefor(model => model.username)%> </div> <%: html.partial("createoredit", model) %> <p> <input type="submit" value="create" /> </p> </fieldset> <% } %> controller: // // get: /myaccount/create public actionresult create() { homecoming view(); } // // post: /myaccount/create [httppost] public actionresult create(myaccount myaccount) { if (modelstate.isvalid) { myaccountrepository.insertorupdate(myaccount); myaccountrepository.save(); homecoming redirecttoaction("index"); } else { homecoming view(); } } repository: public class myaccountrepository : imyaccountrepository { par4scorecontext context = new par4scorecontext(); public iqueryable<myaccount> { { homecoming context.myaccounts; } } public iqueryable<myaccount> allincluding(params expression<func<myaccount, object>>[] includeproperties) { iqueryable<myaccount> query = context.myaccounts; foreach (var includeproperty in includeproperties) { query = query.include(includeproperty); } homecoming query; } public myaccount find(string id) { homecoming context.myaccounts.find(id); } public void insertorupdate(myaccount myaccount) { if (myaccount.username == default(string)) { // new entity context.myaccounts.add(myaccount); } else { // existing entity context.entry(myaccount).state = entitystate.modified; } } public void delete(string id) { var myaccount = context.myaccounts.find(id); context.myaccounts.remove(myaccount); } public void save() { context.savechanges(); } } public interface imyaccountrepository { iqueryable<playeraccount> { get; } iqueryable<playeraccount> allincluding(params expression<func<myaccount, object>>[] includeproperties); myaccount find(string id); void insertorupdate(myaccount playeraccount); void delete(string id); void save(); } error in myaccountrepository.save(): system.data.entity.infrastructure.dbupdateconcurrencyexception unhandled user code: "store update, insert, or delete statement affected unexpected number of rows (0). entities may have been modified or deleted since entities loaded. refresh objectstatemanager entries." stacktrace: @ system.data.entity.internal.internalcontext.savechanges() @ system.data.entity.internal.lazyinternalcontext.savechanges() @ system.data.entity.dbcontext.savechanges() @ myproject.models.myaccountrepository.save() ....
innerexception: system.data.optimisticconcurrencyexception message=store update, insert, or delete statement affected unexpected number of rows (0). entities may have been modified or deleted since entities loaded. refresh objectstatemanager entries. source=system.data.entity stacktrace: @ system.data.mapping.update.internal.updatetranslator.validaterowsaffected(int64 rowsaffected, updatecommand source) @ system.data.mapping.update.internal.updatetranslator.update(ientitystatemanager statemanager, ientityadapter adapter) @ system.data.entityclient.entityadapter.update(ientitystatemanager entitycache) @ system.data.objects.objectcontext.savechanges(saveoptions options) @ system.data.entity.internal.internalcontext.savechanges()
since mvc model binder assign empty string username can check whether new or not using string.isnulorempty(playeraccount.username). can utilize isnullorwhitespace if treat spaces empty.
public void insertorupdate(myaccount myaccount) { if (string.isnulorempty(myaccount.username)) { // new entity context.myaccounts.add(myaccount); } else { // existing entity context.entry(myaccount).state = entitystate.modified; } } asp.net-mvc-3 ef-code-first
Comments
Post a Comment