MetaMapper.cs 3.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. using System.Collections.Generic;
  2. using System.ComponentModel.DataAnnotations.Schema;
  3. using System.Linq;
  4. using System.Reflection;
  5. using System.Text;
  6. namespace EfDbCommentGenerator.Core
  7. {
  8. internal class MetaMapper
  9. {
  10. public static string Generate(string asmPath)
  11. {
  12. var doc = new XmlDocFinder();
  13. var asm = Assembly.LoadFrom(asmPath);
  14. var types = asm.GetTypes();
  15. var tblTypes = types
  16. .Where(p => p.IsDefined(typeof(TableAttribute)) && p.IsAbstract == false)
  17. .ToArray();
  18. var entries = new List<CommentEntry>();
  19. foreach (var tblType in tblTypes)
  20. {
  21. var tNam = tblType.GetCustomAttribute<TableAttribute>().Name;
  22. var tDoc = doc.FindDoc(tblType);
  23. entries.Add(new CommentEntry { Table = tNam, Column = null, Comment = tDoc });
  24. entries.AddRange(tblType
  25. .GetProperties()
  26. .Where(p => //Skip NaviProp and Getter
  27. p.CanWrite && p.CanRead
  28. && false == p.PropertyType.IsDefined(typeof(TableAttribute))
  29. && false == (p.PropertyType.IsGenericType && p.PropertyType.GetGenericTypeDefinition() == typeof(ICollection<>))
  30. )
  31. .Select(p => new
  32. {
  33. prop = p,
  34. pDoc = doc.FindDoc(p)
  35. })
  36. .Where(p => !string.IsNullOrEmpty(p.pDoc))
  37. .Select(p => new CommentEntry
  38. {
  39. Table = tNam,
  40. Column = p.prop.IsDefined(typeof(ColumnAttribute))
  41. ? p.prop.GetCustomAttribute<ColumnAttribute>().Name
  42. : p.prop.Name,
  43. Comment = p.pDoc
  44. })
  45. );
  46. }
  47. var sb = new StringBuilder();
  48. foreach (var entry in entries)
  49. {
  50. var comment = entry
  51. .Comment?
  52. .Replace("'", "''") //你懂
  53. .Replace("\n", " ")
  54. .Trim(' ', '\t'); //去空格
  55. if (string.IsNullOrEmpty(comment)) continue;
  56. //------------------------------ Dont Care error.... -------------------------
  57. sb.AppendLine($"EXEC sp_addextendedproperty");
  58. sb.AppendLine($" @name = N'MS_Description'" + $",@value = N'{comment}'");
  59. sb.AppendLine($" ,@level0type = N'Schema'" + $",@level0name = N'dbo'");
  60. sb.AppendLine($" ,@level1type = N'Table'" + $",@level1name = N'{entry.Table}'");
  61. if (false == string.IsNullOrEmpty(entry.Column))
  62. sb.AppendLine(
  63. $" ,@level2type = N'Column'" + $",@level2name = N'{entry.Column}'"
  64. );
  65. //------------------------------ Dont Care error.... -------------------------
  66. sb.AppendLine("GO");
  67. sb.AppendLine($"EXEC sp_updateextendedproperty");
  68. sb.AppendLine($" @name = N'MS_Description'" + $",@value = N'{comment}'");
  69. sb.AppendLine($" ,@level0type = N'Schema'" + $",@level0name = N'dbo'");
  70. sb.AppendLine($" ,@level1type = N'Table'" + $",@level1name = N'{entry.Table}'");
  71. if (false == string.IsNullOrEmpty(entry.Column))
  72. sb.AppendLine(
  73. $" ,@level2type = N'Column'" + $",@level2name = N'{entry.Column}'"
  74. );
  75. sb.AppendLine("GO");
  76. }
  77. var sql = sb.ToString();
  78. return sql;
  79. }
  80. }
  81. }