---
title: EdiFile
summary: API reference for EdiFile.
status: draft
owner: SAIF Doc Gen
last_reviewed: 2026-09-15
library: SAIF.Framework.Common.Files
reference_type: package
---

# EdiFile

`EdiFile` is the root domain object for a parsed or constructed EDI interchange; it owns the flat `Segments` list produced by parsing (or built up via `Add`) and lazily derives the functional-group envelope hierarchy (`FunctionalGroups`) on first access. It is the primary object handed back by `IEdiFileBuilder.Read()` and passed into `IEdiFileBuilder.Write(file)`.

## Purpose
- Stores every segment of an interchange in insertion order and exposes the ISA header / IEA trailer as both raw `IEdiSegment` and strongly-typed (`IsaSegment`/`IeaSegment`) forms.
- `Add(IEdiSegment)` assigns the next sequential index to the segment via `IndexingSequence` ([BR-031](../../business-rules.md#br-031-every-added-segment-receives-the-next-sequential-index)) and, when the added segment is one of ISA/IEA/GS/GE, re-derives the envelope groupings by calling `RefreshGroupings()` ([BR-032](../../business-rules.md#br-032-adding-a-control-segment-re-derives-envelope-groupings)).
- `RefreshGroupings()` locates the first ISA and IEA segments and parses them as the interchange header/trailer ([BR-029](../../business-rules.md#br-029-first-isa-and-iea-are-the-interchange-header-and-trailer)), and only triggers functional-group construction when ISA, IEA, GS, and GE are all present in `Segments` ([BR-030](../../business-rules.md#br-030-functional-groups-built-only-when-all-four-control-segments-present)).
- `FunctionalGroups` is the one place the model layer calls back into the parser layer (`EdiGroupParser.CreateFunctionalGroups`), caching the result after first access — a lazy-initialization crossover point between the model and parser layers.*

## Context
- Namespace: `SAIF.Common.Files.Edi`
- Assembly/package: `SAIF.Framework.Common.Files`
- Base class: `EdiRecordBase`
- Implements: `IEdiFile`

## Public members
| Member | Signature | Purpose |
| --- | --- | --- |
| Header | `public IsaSegment Header { get; internal set; }` | The strongly-typed interchange header parsed from the first ISA segment found by `RefreshGroupings()`. |
| HeaderSegment | `public IEdiSegment HeaderSegment { get; internal set; }` | The raw ISA segment instance used as the source for `Header`. |
| Trailer | `public IeaSegment Trailer { get; internal set; }` | The strongly-typed interchange trailer parsed from the first IEA segment found by `RefreshGroupings()`. |
| TrailerSegment | `public IEdiSegment TrailerSegment { get; internal set; }` | The raw IEA segment instance used as the source for `Trailer`. |
| Segments | `public IEnumerable<IEdiSegment> Segments { get; }` | The full flat, ordered collection of every segment in the interchange, including control segments. |
| FunctionalGroups | `public IFunctionalGroupContainer FunctionalGroups { get; }` | Lazily builds (via `EdiGroupParser.CreateFunctionalGroups`) and caches the GS/GE-delimited functional-group hierarchy for this file. |
| Add | `public void Add(IEdiSegment segment)` | Assigns the next sequential index to `segment` ([BR-031](../../business-rules.md#br-031-every-added-segment-receives-the-next-sequential-index)), appends it to `Segments`, and re-derives groupings when the segment is ISA, IEA, GS, or GE ([BR-032](../../business-rules.md#br-032-adding-a-control-segment-re-derives-envelope-groupings)). |
| RefreshGroupings | `public void RefreshGroupings()` | Re-locates the ISA/IEA header and trailer segments ([BR-029](../../business-rules.md#br-029-first-isa-and-iea-are-the-interchange-header-and-trailer)) and rebuilds `FunctionalGroups` only when ISA, IEA, GS, and GE are all present ([BR-030](../../business-rules.md#br-030-functional-groups-built-only-when-all-four-control-segments-present)). |
| FileName | `public string FileName { get; set; }` | The file name associated with this interchange, used by the writer when persisting the file. |
| SegmentCount | `public int SegmentCount { get; }` | The total number of segments currently in `Segments`, including control segments. |
| SetSegments | `protected internal void SetSegments(IEnumerable<IEdiSegment> segmentList)` | Replaces the entire segment list in bulk (used by the file reader/parser) and immediately calls `RefreshGroupings()` to rebuild the header/trailer/functional-group state. |

## Inherited public members

Members in this section are inherited from `EdiRecordBase` in `SAIF.Framework.Common.Files`. They are available on this type through inheritance.

| Member | Signature | Purpose | Origin |
| --- | --- | --- | --- |
| SegmentDelimiter | `protected char[] SegmentDelimiter` | The single-character tilde (`~`) delimiter used to split/join segments. | `SAIF.Framework.Common.Files` — `EdiRecordBase` |
| DataElementDelimiter | `protected char[] DataElementDelimiter` | The single-character asterisk (`*`) delimiter used to split/join data elements within a segment. | `SAIF.Framework.Common.Files` — `EdiRecordBase` |
| SubElementDelimiter | `protected char[] SubElementDelimiter` | The single-character colon (`:`) delimiter used to split/join sub-elements within a composite data element. | `SAIF.Framework.Common.Files` — `EdiRecordBase` |
| IndexingSequence | `protected Sequence IndexingSequence` | Generates the next sequential segment index consumed by `Add(IEdiSegment)`. | `SAIF.Framework.Common.Files` — `EdiRecordBase` |

## Behavioral notes
- `FunctionalGroups` caches its result in a private field after the first access; subsequent reads do not re-parse unless `RefreshGroupings()` explicitly triggers `EdiGroupParser.CreateFunctionalGroups` again.
- `RefreshGroupings()` silently leaves `Header`/`Trailer` unset if no ISA/IEA segment is present, rather than throwing.

> **Note:** Statements marked with `*` were inferred from code structure, naming
> conventions, or contextual evidence where direct confirmation was not available
> in source artifacts.

## Sources
- Common\SAIF.Common.Files\Edi\EdiFile.cs
- Common\SAIF.Common.Files\Edi\IEdiFile.cs
