This is an ASP.NET MVC project using EF6. A stored procedure needs to be called that takes a table-valued parameter.
This turned out to have nothing to do with EF6 or EF6 Extras. The reason the proc worked fine when being called from SSMS was because the TVP was constructed correctly there. The C# code however filled the TVP with incorrect values resulting in the proc returning zero for the decimal column. Ugh!
The troubleshooting technique of repeatedly simplifying the .net code and the proc, and retesting after each iteration, eventually pinpointed the problem, but it took forever.
Test driven development would have uncovered this immediately and saved a tremendous amount of time. In my experience, for TDD to by truly effective, it must be in a project using IoC containers and a mock framework. Those projects seem hard to come by.
Use of SQL Extended Events to trace the calls may have shown the value being passed into the proc's parameters. This information is not available with EF6's built in logging feature.