When I use DbContext directly to insert an object to an entity, the new inserted object id can be used immediately after SaveChanges(). For example,
MyContext.MyEntity.AddObject(obj); MyContext.SaveChanges(); var id=obj.id; // It is new id.
When I use await _repository.InsertAsync(obj), It returns the same type of "obj" but with id = -2147482647, instead of the new inserted object. Is it by design or a bug?
7 Answer(s)
-
0
It is by design. InsertAsync only does Table.Add(entity), which avoids the overhead of calling SaveChanges.
You can use InsertAndGetIdAsync or call SaveChanges:
// 1 var id = await _repository.InsertAndGetIdAsync(obj); // New id // 2 await _repository.InsertAsync(obj); _unitOfWorkManager.Current.SaveChanges(); var id = obj.Id; // New id
-
0
Understand. I just feel the "-2147482647" weird.
Thank you for clarification!
-
0
Understand. I just feel the "-2147482647" weird.
So did @hikalkan on Jul 23, 2016 ;)
-
0
I encountered a new issue related this insert method.
I use "var id = await _repository.InsertAndGetIdAsync(obj); ". It does return a new id, however, the database seems not really updated. My code snippet is like:
var id = await _repository.InsertAndGetIdAsync(obj); Process proc = new Process(); proc.StartInfo.FileName = @"command"; proc.Start();
After inserting the obj, it triggers a Process with "command". The above Process should aggregate the whole obj table, but it actually always excludes the current inserted obj. For example, the MAX(id) is not the "new id", instead, it is always "new id - 1".
I also tried:
var id = await _repository.InsertAndGetIdAsync(obj); UnitOfWorkManager.Current.SaveChanges();
but it's no help.
Does "await _repository.InsertAndGetIdAsync(obj); " immedietely updates the database? If not, when it does?
Thanks,
-
0
It's inserted but not committed. To commit it, you can complete a new unit of work.
using (var uow = _unitOfWorkManager.Begin(TransactionScopeOption.RequiresNew)) { var id = await _repository.InsertAndGetIdAsync(obj); await uow.CompleteAsync(); }
-
0
It works! Thank you!
Just for curious, if I don't manually commit it, is it automatically committed at the method ending?
I think I need to learn more about the UnitOfWorkManager. Where can I find the documentation? Can you provide me a link?
Thanks again!
-
0
Yes. At the end of the method, the transaction is committed and the connection is disposed.
You can read about IUnitOfWorkManager in the documentation on Unit Of Work.