c# - DbUpdateConcurrencyException when Editing an Entity -
i have following classes in ef6 application.
public class extension { [key] [column(order = 1)] [databasegenerated(databasegeneratedoption.none)] [foreignkey("record")] public string recordid { get; set; } public record record { get; set; } [key] [column(order = 2)] [datatype(datatype.date)] [databasegenerated(databasegeneratedoption.none)] [displayformat(dataformatstring = "{0:yyyy-mm-dd}", applyformatineditmode = true)] [display(name = "extension date")] public datetime extensiondate { get; set; } [required] [range(1, 100)] [display(name = "days extended")] public int daysextended { get; set; } [required] [display(name = "details")] public string details { get; set; } [required] [foreignkey("extendedbyuser")] public string extendedbyuserid { get; set; } public applicationuser extendedbyuser { get; set; } } public class record { // id [key] public string id { get; set; } // status [required] public recordstatus status { get; set; } // date created [required] [datatype(datatype.date)] [displayformat(dataformatstring = "{0:yyyy-mm-dd}", applyformatineditmode = true)] [display(name = "date created")] public datetime datecreated { get; set; } // created [foreignkey("createdbyuser")] public string createdbyuserid { get; set; } public applicationuser createdbyuser { get; set; } // date of last edit [datatype(datatype.date)] [displayformat(dataformatstring = "{0:yyyy-mm-dd}", applyformatineditmode = true)] public datetime? lastediteddate { get; set; } // user performed last edit [foreignkey("lasteditedbyuser")] public string lasteditedbyuserid { get; set; } public applicationuser lasteditedbyuser { get; set; } // submission date [datatype(datatype.date)] [displayformat(dataformatstring = "{0:yyyy-mm-dd}", applyformatineditmode = true)] [display(name = "date submitted")] public datetime? submissiondate { get; set; } // user submitted record [foreignkey("submittedbyuser")] public string submittedbyuserid { get; set; } public applicationuser submittedbyuser { get; set; } } the applicationuser class default class users created visual studio asp.net mvc template.
i'm able create extensions , save them database fine, when try edit them dbupdateconcurrencyexception. example, following code throws exception without fail.
class program { static void main(string[] args) { using (applicationdbcontext db = new applicationdbcontext()) { extension extension = new extension { details = "details new extension.", daysextended = 25, extendedbyuserid = db.users.first().id, recordid = db.records.first().id, extensiondate = datetime.now }; // create db.extensions.add(extension); db.savechanges(); // <-- works // edit extension.details = "some new details"; extension.daysextended = 40; db.savechanges(); // <-- fails every time } } } could please shed light on why may happening? know exception means entry has been modified since loaded context, there no reason record should have changed between creation of entry , modification of entry.
please let me know if more information required.
update
well, able fix it...
the c# datetime object , "datetime" data type in sql server have compatibility issues. somehow datetime stored in extension object considered unequal "datetime" value stored in database. causes entity framework throw concurrency exception whenever try update extension record because believes values have been changed since entry loaded.
in case, there 2 ways fix problem (i went latter, because more aligned original intentions).
- set data type of column used represent extensiondate property "datetime2".
- set data type of column used represent extensiondate property "date" , use date when working datetime.
i'll post answer, i'd know exact cause of incompatibility before posting. know why these 2 types incompatible?
this due value of datetime.now being stored in memory compared value being stored in sql server. datetime has time range can store between 00:00:00 through 23:59:59.997. datetime2 has larger storage range between 00:00:00 through 23:59:59.9999999.
Comments
Post a Comment