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 idMarkdown is supportedCopy & paste or drag & drop images (max 30 MB per image) -
0
Understand. I just feel the "-2147482647" weird.
Thank you for clarification!
Markdown is supportedCopy & paste or drag & drop images (max 30 MB per image) -
0
Understand. I just feel the "-2147482647" weird.
So did @hikalkan on Jul 23, 2016 ;)
Markdown is supportedCopy & paste or drag & drop images (max 30 MB per image) -
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,
Markdown is supportedCopy & paste or drag & drop images (max 30 MB per image) -
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(); }Markdown is supportedCopy & paste or drag & drop images (max 30 MB per image) -
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!
Markdown is supportedCopy & paste or drag & drop images (max 30 MB per image) -
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.
Markdown is supportedCopy & paste or drag & drop images (max 30 MB per image)