My table Sections (SQL Server) has ID as a primary key (int, identity) and SortIndex column (int) for sorting purposes.
The database has a trigger which sets SortIndex := ID at each INSERT. Obviously I want to change the sorting index later, by swapping the values for two rows.
I access the data using Entity Framework, all with MVC3 web application.
The problem is, Entity Framework doesn’t update the value of SortIndex after I insert a new object into the table. It also caches all the data, so the following call to get all objects from this table will also give wrong SortIndex value for this object.
I tried changing StoreGeneratedPattern for this column in EDMX. This seems to be great and elegant but doesn’t solve the problem.
If I set to Identity, it causes EF to properly update the value, but it becomes read only (exception thrown when trying to change). Setting it to Computed is similar, but instead of exception being thrown the values are just not written to the DB.
I can recreate the EF object every time if I need to use it after inserting an object, just by doing:
DatabaseEntities db = new DatabaseEntities()
But it seems like ugly workaround for me.
What’s a solution to this problem?
Obviously something, what doesn’t require me to do some action after every insert (and take a risk that it’s forgotten and unnoticed) is preferred.
In short
StoreGeneratedPatternmeans: the value is handled by the store and your application will never modify it. In such case you will get store generated value automatically after you callSaveChanges.If you don’t use
StoreGeneratedPatternyou will not get value and you will have to force another query execution to refresh your entity. You can for example do:Generally situations where you need to update values in both database through triggers and application don’t play very nicely with EF (and probably also other ORM tools).