如何为Entity对象生成自定义文本文件

时间:2013-07-12 15:06:09

标签: c#

前言:我正在编写一套程序,从共享驱动器中检索文件,将它们转换为数据库中的几个表,使用户能够对数据库中的记录执行CRUD操作(通过MVC4 ASP.NET Web应用程序),然后将数据库中的记录重新组装成相同的文件格式并将文件FTP返回到主机。这些文件表示从大型机VSAM文件中提取的数据,我无法控制格式。还有其他项目会出现类似的徒劳 - 检索,翻译,编辑,汇编和上传大型机提取文件。一切都很完整,但我编写汇编文件的代码的方式不可重用,并且只针对当前项目域模型中的Entity对象。

Oppurtunity:由于其他即将推出的项目的文件中的数据格式非常相似,我希望有一些可恢复的代码来重新组合这些文件。

数据:以下代表一些模拟文件数据。文件中的每一行文本(我现在称之为记录)可以是特定长度(在这种情况下为80字节)。记录可以是带有星号前缀的注释。未注释的记录可以有4种不同的类型。

  • 序列预告片
  • Table Trailer
  • 表类型预告片

A' Line'属于'序列' (序列号 - 仅对表有唯一性)。 A'序列'属于'表' (表键 - 文件唯一)。 A'表'有一个类型,表按文件中的类型和键排序。

该行按顺序排列如下:

  1. 三位数的商业代码。
  2. 三字表类型。
  3. 五个字符表键。
  4. 九位数序列号。左零填充。
  5. 六位数行号。左零填充。
  6. 三个字符的操作代码。
  7. 一个字符,包括代码。
  8. 五位数的长度。
  9. 休息是价值观。
  10. 序列预告片按顺序排列如下:

    1. 三位数的商业代码。
    2. 三字表类型。
    3. 五个字符表键。
    4. 九位数序列号。左零填充。
    5. 五位数填充物(' 9')。
    6. 序列中的九位数行数(左零填充)。
    7. 表格预告片按顺序排列如下:

      1. 三位数的商业代码。
      2. 三字表类型。
      3. 五个字符表键。
      4. 十四位填料(' 9')。
      5. 表中的九位数序列(左边填充)。
      6. “表格预告片”按顺序排列如下:

        1. 三位数的商业代码。
        2. 三字表类型。
        3. 十九位数的填充物(' 9')。
        4. 文件中九位数的表(#2表类型)。 (留下零填充)。
        5. 表格预告片发生在文件中每个有序的表格集之后。

          ************************************************************************
          *    TABLE 00001  -  SOME MORE COMMENTS
          *          04/04/11  CREATED TABLE
          ************************************************************************
          * COMMENT FOR SEQ 1
          720PFT0000100000001000001PROI00011E1037-E1039
          720PFT0000100000001000002PGMI000016
          720PFT0000100000001000003RTN 00004 NAC
          720PFT0000100000001099999000000003
          * COMMENT FOR SEQ 2
          720PFT0000100000003000001PROI00011E1037-E1039
          720PFT0000100000003000002CLSI000037,8
          720PFT0000100000003000003MEDE000010
          720PFT0000100000003000004RTN 00004 NAC
          720PFT0000100000003099999000000004
          720PFT0000199999999999999000000002
          720PFT9999999999999999999000000001
          

          代码:以下代表域模型中的实体(为简洁起见,我排除了相关实体):

          [Table("Line",Schema="Pft")]
          public class Line
          {
              #region Entity Properties
          
              [Key]
              public int LineId { get; set; }
          
              [Required]
              public short LineNumber { get; set; }
          
              [StringLength(255)]
              public string Comment { get; set; }
          
              [Required]
              public int SequenceId { get; set; }
          
              [Required]
              public int IncludeExcludeId { get; set; }
          
              [Required]
              public int QualifierId { get; set; }
          
              [Required]
              [ForeignKey("PlanFlexTable")]
              public int PlanFlexTableId { get; set; }
          
              #endregion
          }
          
          [Table("Sequence", Schema="Pft")]
          public class Sequence
          {
              #region Entity Properties
          
              [Key]
              public int SequenceId { get; set; }
          
              [Required]
              public int SequenceNumber { get; set; }
          
              [StringLength(511)]
              public string Comment { get; set; }
          
              #endregion
          }
          
          [Table("PlanFlexTable", Schema = "Pft")]
          public class PlanFlexTable
          {
              #region Entity Properties
          
              [Key]
              public int PlanFlexTableId { get; set; }
          
              [Required]
              public int StatusId { get; set; }
          
              [StringLength(5, MinimumLength = 5)]
              [Required]
              public string Key { get; set; }
          
              [StringLength(255)]
              [Required(AllowEmptyStrings = true)]
              public string Title { get; set; }
          
              [Display(Name="Table Comment")]
              public string Comment { get; set; }
          
              public int PlanFlexTableTypeId { get; set; }
          
              public int UpdateHistoryId { get; set; }
          
              [StringLength(3)]
              [Required]
              public string PlanId { get; set; }
          
              #endregion
          }
          

          摘要:我正在寻找可重用的生成文件的建议,就像上面提到的那样。目前我有一个类接受PlanFlexTable实体的IEnumerable并迭代它组装要上传的文件。我已经考虑过使用反射创建一些属性来放置实体来定义文件的构建方式;但是,我真的很感激有关其他可能性的更多反馈和想法。

          谢谢!

1 个答案:

答案 0 :(得分:0)

你想动态生成代码....试试T4?您可以使用模式基础(键控等)为您的实体类创建一个基本模板,并根据VSAM文件(为此您拥有可重用的解析器...)填充该类的其余部分。 / p>

鉴于(生成的)实体类和数据库表,您的CRUD工具的其余部分可能是可重用的吗?