Entity core framework fix at 2026.100?

That’s where the confusion comes in… But InvoiceNum, CheckNum etc the ones that I was thinking of aren’t in the list, so we should be good.

Identity Columns Analyzer Checks

Table Identity Column
Erp.Tables.ABTAmount ABTAmountUID
Erp.Tables.ABTDocLine ABTDocLineUID
Erp.Tables.ABTPostCode ABTPostCodeUID
Erp.Tables.ABTPostEntity ABTPostEntityUID
Erp.Tables.ABTQuery ABTQueryUID
Erp.Tables.ACTRevision ACTRevisionUID
Erp.Tables.ACTType ACTTypeUID
Erp.Tables.AdditionalProcInfo ErrSequence
Erp.Tables.Adjustment1099 AdjustmentNum
Erp.Tables.APPNHead HeadNum
Erp.Tables.APTranImport APTranImportNo
Erp.Tables.ARPNHead HeadNum
Erp.Tables.BankBalDeferred DeferredSeq
Erp.Tables.BookDtl TranNum
Erp.Tables.BookingRule RuleUID
Erp.Tables.BookRel TranNum
Erp.Tables.BookVar BookVarUID
Erp.Tables.BRFuncArgs ArgumentUID
Erp.Tables.BRFunction FunctionUID
Erp.Tables.BROperation OperationUID
Erp.Tables.BROperationCustom OperationUID
Erp.Tables.BVRule BVRuleUID
Erp.Tables.COAMap COAMapUID
Erp.Tables.CreditCardProcessor ProcessorNum
Erp.Tables.CreditTran TranNum
Erp.Tables.DebNote DebitNoteID
Erp.Tables.DemandContractHdr DemandContractNum
Erp.Tables.DemandLog TranNum
Erp.Tables.DemandReconcile ReconcileNum
Erp.Tables.DynAttrValuePlanningSet PlanningAttributeSetSeq
Erp.Tables.DynAttrValueSet AttributeSetID
Erp.Tables.EFTHead EFTHeadUID
Erp.Tables.EFTProp EFTPropUID
Erp.Tables.EFTPropVal EFTPropValUID
Erp.Tables.EKeyLog LogNum
Erp.Tables.EmpCourse EmpCourseID
Erp.Tables.EmpExpenseComment CommentNum
Erp.Tables.EquipMeter TransNum
Erp.Tables.ExtCompanyECC ECCID
Erp.Tables.ExtSysChunkDef ChunkID
Erp.Tables.Form1099 Form1099Num
Erp.Tables.GLAccLink GLAccLinkUID
Erp.Tables.GlbCustCredDeferred DeferredSeq
Erp.Tables.GlbDynAttrValueSet GlbAttributeSetID
Erp.Tables.GlbPcStatusExpr SeqNum
Erp.Tables.GrowDataSource DataSourceID
Erp.Tables.IMLockboxCheckDtl SequenceNum
Erp.Tables.IMPartTranAttrValueSet TranSeq
Erp.Tables.IMQuoteDtlAttrValueSet AttributeValueSeq
Erp.Tables.LaborDtlComment CommentNum
Erp.Tables.LocationInventory LocationNum
Erp.Tables.LocationTran LocationSeqNum
Erp.Tables.LocationWarrantyTran WarrantySeqNum
Erp.Tables.LockboxCheck LBCheckID
Erp.Tables.LockboxCheckDtl SequenceNum
Erp.Tables.LookupLink LinkUID
Erp.Tables.LookupTable MapUID
Erp.Tables.MtlQueue MtlQueueSeq
Erp.Tables.MXCustomerFiscalText FiscalTextSeq
Erp.Tables.MXDropShipHeadInsurance InsuranceSeq
Erp.Tables.MXInvcHeadFiscalText FiscalTextSeq
Erp.Tables.MXWHTaxCertHead CertificateNum
Erp.Tables.NACreditDoc Seq
Erp.Tables.NACreditUsed Seq
Erp.Tables.PackingShipTo ShipToSeq
Erp.Tables.PartAllocOverAllocationLog OverAllocationLogSeq
Erp.Tables.PartAllocQueueInfoLog Sequence
Erp.Tables.PartAllocTran TranNum
Erp.Tables.PartBinDeferred DeferredSeq
Erp.Tables.PartDtl PartDtlSeq
Erp.Tables.PartLotDeferred DeferredSeq
Erp.Tables.PartQtyAttrDeferred DeferredSeq
Erp.Tables.PartQtyDeferred DeferredSeq
Erp.Tables.PartTran TranNum
Erp.Tables.PartTranAttrValueSet TranSeq
Erp.Tables.PartWipTran TranNum
Erp.Tables.PcPropBagDtl PropertyID
Erp.Tables.PcStatusExpr SeqNum
Erp.Tables.PEBOEStatChHist RecordSeq
Erp.Tables.PECompWhldHist RecordSeq
Erp.Tables.PECustWhldHist RecordSeq
Erp.Tables.PEVendWhldHist RecordSeq
Erp.Tables.PkgControlCustPartNum PCIDCustPartSeq
Erp.Tables.PkgControlItem PCIDItemSeq
Erp.Tables.PkgControlSplitMerge TranNum
Erp.Tables.PkgControlStageHeader StagingNum
Erp.Tables.PkgControlStageItem PCIDItemSeq
Erp.Tables.PkgControlStationResource StationResourceSeq
Erp.Tables.PRCheck HeadNum
Erp.Tables.ProjAnalHistory Seq
Erp.Tables.ProjCstHistory Seq
Erp.Tables.ProjectJobTaken Seq
Erp.Tables.ProjPhCstHist Seq
Erp.Tables.QuoteDtlAttrValueSet AttributeValueSeq
Erp.Tables.RcvDtlAttrValueSet AttributeValueSeq
Erp.Tables.RebateTrans TranNum
Erp.Tables.RvJrnHist RvJrnHistUID
Erp.Tables.SegmentLink SegmentLinkUID
Erp.Tables.ShipHeadInsurance InsuranceSeq
Erp.Tables.SourceValueField SourceValueFieldUID
Erp.Tables.SugPoDtl SugNum
Erp.Tables.TargetValueField TargetValueFieldUID
Erp.Tables.TFShipHeadInsurance InsuranceSeq
Erp.Tables.ttEFTHead EFTHeadUID
Erp.Tables.UserNotification NotificationNum
Erp.Tables.VendRemitTo RemitToSeq
Erp.Tables.Wave WaveNum
Erp.Tables.WebActivityLog TranID
Erp.Tables.WError ErrorUID
Ice.Tables.BpActionQueue QueueNum
Ice.Tables.CaptureLog CaptureLogID
Ice.Tables.ChangeLog ChangeLogID
Ice.Tables.DBMigrationLog LogID
Ice.Tables.DiagnosticLog DiagnosticLogID
Ice.Tables.ImportDocumentBlob BlobID
Ice.Tables.ImportExecutionPlan ExecutionPlanID
Ice.Tables.ImportFile FileID
Ice.Tables.ImportTask TaskID
Ice.Tables.ImportTaskLog LogID
Ice.Tables.IMRptStructuredOutputFileXMLNamespace RptStructuredOutputFileNamespaceID
Ice.Tables.IntegrationInbox InboxId
Ice.Tables.IntegrationInboxLog InboxLogId
Ice.Tables.IntegrationOutbox OutboxId
Ice.Tables.IntegrationOutboxLog OutboxLogId
Ice.Tables.IntQueIn IntQueID
Ice.Tables.IntQueOut IntQueID
Ice.Tables.IoTDeviceEventQueue QueueSeq
Ice.Tables.MailLog LogNum
Ice.Tables.MailQueue QueueNum
Ice.Tables.Memo MemoNum
Ice.Tables.RptStructuredOutputFileXMLNamespace RptStructuredOutputFileNamespaceID
Ice.Tables.SolutionHistory Sequence
Ice.Tables.SubscriberQueue Offset
Ice.Tables.SysActivity ActivitySeq
Ice.Tables.SysActivityLog ActivitySeq
Ice.Tables.SysAgentSched AgentSchedNum
Ice.Tables.SysTask SysTaskNum
Ice.Tables.UDMapTable MapTableID
Ice.Tables.XFileAttch AttachNum
Ice.Tables.XFileRef XFileRefNum

Compiling a list of all the errors we’re getting in 26.100. Way more than the last upgrade.

Is this actually a requirement of EF Core? Or is this something Epicor is enforcing?
I tried writing something like the first code snippet in a separate application that uses EF Core, and I didn’t get any compile time or runtime errors.

This is EF Core behavior. Unlike EF Classic, which attempted to translate almost any query you wrote, EF Core is much stricter about what it will translate to SQL. The upside is that EF Core is generally faster and more efficient, but the downside is that unsupported patterns tend to fail at runtime rather than being silently adjusted. I think most of the issues come from no longer relying on client-side code execution.

One of my biggest frustrations is that these failures are typically only discovered when the code executes. We added code analysis to catch problematic custom logic earlier, but in many cases the query translation rules are complex enough that reliable detection at compile time isn’t always feasible.

(Warning, I used AI to convert “Jeff Speak” into normal words. :blush:)

I see that in the structure @hkeric.wci posted it in… as long as you read it and felt good about sending it, I’m super happy! thanks for taking the time to do all this!

of int/bigint rather

Can this be found anywhere in Microsoft’s documentation?

I just happen to be working on an application that uses EF Core, and, so far, my testing tells me that this is not actually the case.

I was able to write something like this, and it worked without any errors:

 public Batch? GetById(int id)
 {
     var batch = _context.Batch.FirstOrDefault(b => b.Id == id);
     if (batch == null)
     {
         return batch;
     }
     var details = (from d in _context.BatchDetails where d.BatchId == batch.Id select d).ToList();
     batch.Details = details;
     return batch;
 }

I think the keyword being complex data types… I think is it in Data Directive or Method Directive often when I use parentRow.UDField<string>("...") that I have to assign it first to a variable or it crashes during runtime, or is it when I mix Db with ttTables… I dont remember.

Perhaps Jeff example lacks more context – parentRow.Key1 should work.

The one example I can find is this, where I cant just use Convert.ToInt32(item[“PONum”]) in the query below. I had to assign it to variables first.

But this was EF 6… not sure if EF Core is even more stricter, or perhaps its because I have it in a foreach loop and not in a .FirstOrDefault()…

I almost typed out that @hkeric.wci was going to eat up @dmmory 's question about being able to do it in visual studio or whatever. Love to see this type of exchange, great insights and knowledge.

@dmmory , I think the difference is you have two separate EF Core queries being executed in your example. If you put them into a single EF Core query, I think it will blow up. You would probably be OK if you only used the Id column. The issue comes when you have the “complex” data for the batch row. It’s been a while since I looked at this exact issue though.

Definitely some integer type for a IDENTITY(start, increment) field so the integer increment has something to increment.

uniqueidentifier is the alternative that records a GUID. Usually only adds index bloat over int types, but it’s the default for modern app development paradigms that “write the database automatically”.

If I remember correctly, the problem happens not when running an EF query but rather when compiling it. If you were to compile your query above you would see the issue. But a plain EF query might be fine.

@JeffLeBert do you know on the top of your head if ErpEFFunctions will still work?

Db.UD100.Where(x => x.Company == "EPIC06").Select(x => ErpEFFunctions.ConvertToInt(x.Key1)).Max();

I found a Microsoft article that talks about this in a section labeled “Compiled Queries”:

Based on that, I found that compiling a query like this is not allowed:

EF.CompileAsyncQuery((AppDbContext context, Batch b) => context.WhiteboardEntry.Where(e => e.BatchId == b.Id));

You have write it like this and pass the instance member into it:

EF.CompileAsyncQuery((AppDbContext context, int batchId) => context.WhiteboardEntry.Where(e => e.BatchId == batchId));

ErpEFFunctions brings back some old memories. We are using them in our application code, so they should still work. We just link each method to a specific SQL Server function. For example, ErpEFFunctions.ListCount links to the Erp.listCount SQL Server function.

I’ve been using this as a reference to use Ice.Lib.NextValue for a while:

https://www.epiusers.help/t/sequence-function-ice-icecontext/104532

Now, since the 2026.100 upgrade, I’ve got a whole bunch of error message :

Is it related ?

That looks like local errors, does it still save?

If it does, Epicor is looking at the wrong .net stuff locally.

No, it would not let me save.

Also, we’re on cloud ; didn’t know that local .net stuff could be an issue, The exact same code compiles just fine in Prod at the moment.

Did you get out, ignore errors, and save from the main page?

Go in, add a comment or something, ignore the errors, and save from the main page.

Ok sorry I got what you mean. Yes, I can ignore errors and save from the main page.