1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 |
- using System.Collections.Generic;
- using System.ComponentModel.DataAnnotations.Schema;
- using System.Linq;
- using System.Reflection;
- using System.Text;
- namespace EfDbCommentGenerator.Core
- {
- internal class MetaMapper
- {
- public static string Generate(string asmPath)
- {
- var doc = new XmlDocFinder();
- var asm = Assembly.LoadFrom(asmPath);
- var types = asm.GetTypes();
- var tblTypes = types
- .Where(p => p.IsDefined(typeof(TableAttribute)) && p.IsAbstract == false)
- .ToArray();
- var entries = new List<CommentEntry>();
- foreach (var tblType in tblTypes)
- {
- var tNam = tblType.GetCustomAttribute<TableAttribute>().Name;
- var tDoc = doc.FindDoc(tblType);
- entries.Add(new CommentEntry { Table = tNam, Column = null, Comment = tDoc });
- entries.AddRange(tblType
- .GetProperties()
- .Where(p => //Skip NaviProp and Getter
- p.CanWrite && p.CanRead
- && false == p.PropertyType.IsDefined(typeof(TableAttribute))
- && false == (p.PropertyType.IsGenericType && p.PropertyType.GetGenericTypeDefinition() == typeof(ICollection<>))
- )
- .Select(p => new
- {
- prop = p,
- pDoc = doc.FindDoc(p)
- })
- .Where(p => !string.IsNullOrEmpty(p.pDoc))
- .Select(p => new CommentEntry
- {
- Table = tNam,
- Column = p.prop.IsDefined(typeof(ColumnAttribute))
- ? p.prop.GetCustomAttribute<ColumnAttribute>().Name
- : p.prop.Name,
- Comment = p.pDoc
- })
- );
- }
- var sb = new StringBuilder();
- foreach (var entry in entries)
- {
- var comment = entry
- .Comment?
- .Replace("'", "''") //你懂
- .Replace("\n", " ")
- .Trim(' ', '\t'); //去空格
- if (string.IsNullOrEmpty(comment)) continue;
- //------------------------------ Dont Care error.... -------------------------
- sb.AppendLine($"EXEC sp_addextendedproperty");
- sb.AppendLine($" @name = N'MS_Description'" + $",@value = N'{comment}'");
- sb.AppendLine($" ,@level0type = N'Schema'" + $",@level0name = N'dbo'");
- sb.AppendLine($" ,@level1type = N'Table'" + $",@level1name = N'{entry.Table}'");
- if (false == string.IsNullOrEmpty(entry.Column))
- sb.AppendLine(
- $" ,@level2type = N'Column'" + $",@level2name = N'{entry.Column}'"
- );
- //------------------------------ Dont Care error.... -------------------------
- sb.AppendLine("GO");
- sb.AppendLine($"EXEC sp_updateextendedproperty");
- sb.AppendLine($" @name = N'MS_Description'" + $",@value = N'{comment}'");
- sb.AppendLine($" ,@level0type = N'Schema'" + $",@level0name = N'dbo'");
- sb.AppendLine($" ,@level1type = N'Table'" + $",@level1name = N'{entry.Table}'");
- if (false == string.IsNullOrEmpty(entry.Column))
- sb.AppendLine(
- $" ,@level2type = N'Column'" + $",@level2name = N'{entry.Column}'"
- );
- sb.AppendLine("GO");
- }
- var sql = sb.ToString();
- return sql;
- }
- }
- }
|