如何用C#生成EDI 856格式ASN文件?求EDI.Net的POCO类示例
Hey there! I’ve built several EDI 856 (Advance Ship Notice) implementations using edi.net, so I can help you get the POCO classes right. The key thing to remember is that edi.net uses attribute-based mapping to link your C# classes to EDI segments and elements. Let’s break this down step by step.
First, Understand EDI 856 Core Structure
EDI 856 follows a hierarchical structure built around the HL (Hierarchical Level) segment. The typical hierarchy is:
- Level 0: Ship-to party
- Level 1: Order/Release
- Level 2: Line item
- Level 3: Package/Container
Each level nests under the previous one, and edi.net handles this with nested class properties.
Example POCO Classes for EDI 856
Here’s a complete set of POCO classes covering the essential segments of an 856. I’ve added comments to explain each part:
Root EDI Document Class
This wraps the entire EDI interchange, including ISA, GS, and the ST transaction set.
using EdiFabric.Core.Annotations.Edi; using EdiFabric.Core.Model.Edi; using EdiFabric.Core.Model.Edi.X12; using System.Collections.Generic; [EdiMessage] public class Edi856 : EdiMessage { [EdiSegment(Order = 0)] public ISA Isa { get; set; } [EdiSegment(Order = 1)] public GS Gs { get; set; } [EdiSegment(Order = 2)] public ST St { get; set; } // Hierarchical Level 0: Ship-to party [EdiSegment(Order = 3)] public HL HlShipTo { get; set; } [EdiSegment(Order = 4)] public TD5 Td5 { get; set; } // Carrier & shipment details [EdiSegment(Order = 5)] public REF RefShipTo { get; set; } // Ship-to reference identifier // Hierarchical Level 1: Associated order/release [EdiSegment(Order = 6)] public HL HlOrder { get; set; } [EdiSegment(Order = 7)] public REF RefOrder { get; set; } // Purchase order number // Collection of line items (Level 2) [EdiSegmentGroup(Order = 8, StartSegment = typeof(HL))] public List<LineItemGroup> LineItemGroups { get; set; } [EdiSegment(Order = 9)] public SE Se { get; set; } [EdiSegment(Order = 10)] public GE Ge { get; set; } [EdiSegment(Order = 11)] public IEA Iea { get; set; } }
Line Item Group (Level 2)
This groups line item details and any associated packages (Level 3):
[EdiSegmentGroup] public class LineItemGroup { [EdiSegment(Order = 0)] public HL HlLineItem { get; set; } [EdiSegment(Order = 1)] public LIN Lin { get; set; } // Item identification details [EdiSegment(Order = 2)] public SN1 Sn1 { get; set; } // Shipped quantity information // Optional: Package/container details (Level 3) [EdiSegmentGroup(Order = 3, StartSegment = typeof(HL))] public List<PackageGroup> PackageGroups { get; set; } }
Package Group (Level 3)
For container/package-level weight, dimensions, and identifiers:
[EdiSegmentGroup] public class PackageGroup { [EdiSegment(Order = 0)] public HL HlPackage { get; set; } [EdiSegment(Order = 1)] public TD1 Td1 { get; set; } // Package weight & dimensions [EdiSegment(Order = 2)] public REF RefPackage { get; set; } // Package serial number or ID }
Key Mapping Notes
[EdiMessage]: Marks the root class as a valid EDI message container.[EdiSegment(Order = X)]: Defines individual EDI segments and their sequential order in the interchange.[EdiSegmentGroup]: Used for nested hierarchical groups (like line items under an order).- All segment types (e.g.,
ISA,HL,LIN) are predefined inEdiFabric.Core.Model.Edi.X12—you don’t need to redefine every element manually.
How to Generate the EDI File
Once your POCOs are set up, populate them with your shipment data and serialize to an EDI file:
using EdiFabric.Framework.Writers; using System.IO; // Populate the 856 with your actual data var edi856 = new Edi856 { Isa = new ISA { AuthorizationInformationQualifier = "00", AuthorizationInformation = " ", SecurityInformationQualifier = "00", SecurityInformation = " ", InterchangeIdQualifierSender = "ZZ", InterchangeSenderId = "YOUR_SENDER_ID", InterchangeIdQualifierReceiver = "ZZ", InterchangeReceiverId = "YOUR_PARTNER_ID", InterchangeDate = "240520", // Format: YYMMDD InterchangeTime = "1430", // Format: HHMM InterchangeControlStandardsIdentifier = "U", InterchangeControlVersionNumber = "00401", InterchangeControlNumber = "000000001", AcknowledgmentRequested = "0", UsageIndicator = "P" }, // Fill in GS, ST, HL segments, line items, and other details here }; // Serialize to EDI file using var writer = new X12Writer(File.Create("856_ASN.edi")); await writer.WriteAsync(edi856);
Pro Tips for Beginners
- Always cross-reference your POCOs with your trading partner’s EDI specifications—they may require specific segments or elements not covered in the basic example.
- Use edi.net’s built-in validation with
EdiFabric.Framework.Validators.X12Validatorto catch errors before sending the file. - If you need to add custom segments, you can define new classes with the
[EdiSegment]attribute and integrate them into the hierarchy.
内容的提问来源于stack exchange,提问作者Yashpal S

