From 5ce51bc31041f7413e78d09a969476c33ff85e4f Mon Sep 17 00:00:00 2001 From: 28810 <28810@YEXIANGQIN> Date: Fri, 14 Jun 2019 18:14:14 +0800 Subject: [PATCH] =?UTF-8?q?codefirst=20=E6=A0=B9=E6=8D=AE=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E6=B3=A8=E9=87=8A=EF=BC=8C=E8=BF=81=E7=A7=BB=E5=88=B0?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=BA=93=E5=A4=87=E6=B3=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FreeSql.Tests/FreeSql.Tests.csproj | 4 + FreeSql.Tests/FreeSql.Tests.xml | 198 ++++++++++++++++++ FreeSql.Tests/UnitTest1.cs | 7 + FreeSql.Tests/ftTests.xml | 198 ++++++++++++++++++ FreeSql/FreeSql.xml | 7 + FreeSql/Internal/CommonUtils.cs | 33 +++ FreeSql/Internal/Model/ColumnInfo.cs | 1 + FreeSql/Internal/UtilsExpressionTree.cs | 3 + .../FreeSql.Provider.MySql/MySqlCodeFirst.cs | 1 + 9 files changed, 452 insertions(+) create mode 100644 FreeSql.Tests/FreeSql.Tests.xml create mode 100644 FreeSql.Tests/ftTests.xml diff --git a/FreeSql.Tests/FreeSql.Tests.csproj b/FreeSql.Tests/FreeSql.Tests.csproj index 9370e56c..27134387 100644 --- a/FreeSql.Tests/FreeSql.Tests.csproj +++ b/FreeSql.Tests/FreeSql.Tests.csproj @@ -6,6 +6,10 @@ false + + FreeSql.Tests.xml + + diff --git a/FreeSql.Tests/FreeSql.Tests.xml b/FreeSql.Tests/FreeSql.Tests.xml new file mode 100644 index 00000000..55568931 --- /dev/null +++ b/FreeSql.Tests/FreeSql.Tests.xml @@ -0,0 +1,198 @@ + + + + FreeSql.Tests + + + + + 保存或添加,如果主键有值则尝试 Update,如果影响的行为 0 则尝试 Insert + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 类型 + + + + + 内容简介 + + + + + 缩略图 + + + + + 点击量 + + + + + + + + + + + + + + + + + + + + + + + + + 主键,ID + + + + + 试卷表 + + + + + 考核计划ID + + + + + 总分 + + + + + 菜单权限ID + + + + + 菜单主键ID + + + + + 按钮主键ID + + + + + 菜单权限 + + + + + 主键 + + + + + 父级ID + + + + + 名称 + + + + + 图标 + + + + + 链接地址 + + + + + 是否公开 + + + + + 排序 + + + + + 备注 + + + + + 创建日期 + + + + + 按钮主键 + + + + + 名称 + + + + + 事件名称 + + + + + 编码 + + + + + 图标 + + + + + 排序 + + + + + 创建日期 + + + + diff --git a/FreeSql.Tests/UnitTest1.cs b/FreeSql.Tests/UnitTest1.cs index ea48b4ca..54d3e0d6 100644 --- a/FreeSql.Tests/UnitTest1.cs +++ b/FreeSql.Tests/UnitTest1.cs @@ -231,6 +231,9 @@ namespace FreeSql.Tests { public virtual TaskBuild TaskBuild { get; set; } } public class Templates { + /// + /// 主键,ID + /// [Column(IsPrimary = true)] public Guid Id { get; set; } public string Title { get; set; } @@ -267,6 +270,10 @@ namespace FreeSql.Tests { [Fact] public void Test1() { + var dkdkdkd = g.mysql.Select().ToList(); + + + var testaddlist = new List(); for(var a = 0; a < 133905; a++) { testaddlist.Add(new NewsArticle { diff --git a/FreeSql.Tests/ftTests.xml b/FreeSql.Tests/ftTests.xml new file mode 100644 index 00000000..55568931 --- /dev/null +++ b/FreeSql.Tests/ftTests.xml @@ -0,0 +1,198 @@ + + + + FreeSql.Tests + + + + + 保存或添加,如果主键有值则尝试 Update,如果影响的行为 0 则尝试 Insert + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 类型 + + + + + 内容简介 + + + + + 缩略图 + + + + + 点击量 + + + + + + + + + + + + + + + + + + + + + + + + + 主键,ID + + + + + 试卷表 + + + + + 考核计划ID + + + + + 总分 + + + + + 菜单权限ID + + + + + 菜单主键ID + + + + + 按钮主键ID + + + + + 菜单权限 + + + + + 主键 + + + + + 父级ID + + + + + 名称 + + + + + 图标 + + + + + 链接地址 + + + + + 是否公开 + + + + + 排序 + + + + + 备注 + + + + + 创建日期 + + + + + 按钮主键 + + + + + 名称 + + + + + 事件名称 + + + + + 编码 + + + + + 图标 + + + + + 排序 + + + + + 创建日期 + + + + diff --git a/FreeSql/FreeSql.xml b/FreeSql/FreeSql.xml index 77e52249..e59d286f 100644 --- a/FreeSql/FreeSql.xml +++ b/FreeSql/FreeSql.xml @@ -2270,6 +2270,13 @@ + + + 通过属性的注释文本,通过 xml 读取 + + + Dict:key=属性名,value=注释 + 中间表,多对多 diff --git a/FreeSql/Internal/CommonUtils.cs b/FreeSql/Internal/CommonUtils.cs index c2510bf5..c16f0104 100644 --- a/FreeSql/Internal/CommonUtils.cs +++ b/FreeSql/Internal/CommonUtils.cs @@ -8,11 +8,14 @@ using System.Collections; using System.Collections.Concurrent; using System.Collections.Generic; using System.Data.Common; +using System.IO; using System.Linq; using System.Linq.Expressions; using System.Reflection; using System.Text; using System.Threading.Tasks; +using System.Xml; +using System.Xml.XPath; namespace FreeSql.Internal { public abstract class CommonUtils { @@ -239,6 +242,36 @@ namespace FreeSql.Internal { return iidx == 1 ? sb.Remove(0, 5).Remove(sb.Length - 1, 1).ToString() : sb.Remove(0, 4).ToString(); } + /// + /// 通过属性的注释文本,通过 xml 读取 + /// + /// + /// Dict:key=属性名,value=注释 + public static Dictionary GetProperyCommentBySummary(Type type) { + var xmlPath = type.Assembly.Location.Replace(".dll", ".xml"); + if (File.Exists(xmlPath) == false) return null; + + var dic = new Dictionary(); + var className = type.IsNested ? $"{type.Namespace}.{type.DeclaringType.Name}.{type.Name}" : $"{type.Namespace}.{type.Name}"; + var sReader = new StringReader(File.ReadAllText(xmlPath)); + using (var xmlReader = XmlReader.Create(sReader)) { + var xpath = new XPathDocument(xmlReader); + var xmlNav = xpath.CreateNavigator(); + + var props = type.GetProperties(); + foreach (var prop in props) { + var node = xmlNav.SelectSingleNode($"/doc/members/member[@name='P:{className}.{prop.Name}']/summary"); + if (node == null) continue; + var comment = node.InnerXml.Trim(' ', '\r', '\n', '\t'); + if (string.IsNullOrEmpty(comment)) continue; + + dic.Add(prop.Name, comment); + } + } + + return dic; + } + public static void PrevReheatConnectionPool(ObjectPool pool, int minPoolSize) { if (minPoolSize <= 0) minPoolSize = Math.Min(5, pool.Policy.PoolSize); if (minPoolSize > pool.Policy.PoolSize) minPoolSize = pool.Policy.PoolSize; diff --git a/FreeSql/Internal/Model/ColumnInfo.cs b/FreeSql/Internal/Model/ColumnInfo.cs index 24bfdcd9..fe17b231 100644 --- a/FreeSql/Internal/Model/ColumnInfo.cs +++ b/FreeSql/Internal/Model/ColumnInfo.cs @@ -10,6 +10,7 @@ namespace FreeSql.Internal.Model { public string CsName { get; set; } public Type CsType { get; set; } public ColumnAttribute Attribute { get; set; } + public string Comment { get; internal set; } static ConcurrentDictionary> _dicGetMapValue = new ConcurrentDictionary>(); public object GetMapValue(object obj) { diff --git a/FreeSql/Internal/UtilsExpressionTree.cs b/FreeSql/Internal/UtilsExpressionTree.cs index 1b38ca9f..1899dcb2 100644 --- a/FreeSql/Internal/UtilsExpressionTree.cs +++ b/FreeSql/Internal/UtilsExpressionTree.cs @@ -56,6 +56,7 @@ namespace FreeSql.Internal { if (tbattr != null) trytb.DisableSyncStructure = tbattr.DisableSyncStructure; var propsLazy = new List<(PropertyInfo, bool, bool)>(); var propsNavObjs = new List(); + var propsComment = CommonUtils.GetProperyCommentBySummary(entity); foreach (var p in trytb.Properties.Values) { var setMethod = trytb.Type.GetMethod($"set_{p.Name}"); var colattr = common.GetEntityColumnAttribute(entity, p); @@ -124,6 +125,8 @@ namespace FreeSql.Internal { CsType = p.PropertyType, Attribute = colattr }; + if (propsComment != null && propsComment.TryGetValue(p.Name, out var trycomment)) + col.Comment = trycomment; if (colattr.IsIgnore) { trytb.ColumnsByCsIgnore.Add(p.Name, col); continue; diff --git a/Providers/FreeSql.Provider.MySql/MySqlCodeFirst.cs b/Providers/FreeSql.Provider.MySql/MySqlCodeFirst.cs index 6148c2a0..1c9950c8 100644 --- a/Providers/FreeSql.Provider.MySql/MySqlCodeFirst.cs +++ b/Providers/FreeSql.Provider.MySql/MySqlCodeFirst.cs @@ -119,6 +119,7 @@ namespace FreeSql.MySql { sb.Append(" \r\n ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" "); sb.Append(tbcol.Attribute.DbType); if (tbcol.Attribute.IsIdentity == true && tbcol.Attribute.DbType.IndexOf("AUTO_INCREMENT", StringComparison.CurrentCultureIgnoreCase) == -1) sb.Append(" AUTO_INCREMENT"); + if (string.IsNullOrEmpty(tbcol.Comment) == false) sb.Append(" COMMENT ").Append(_commonUtils.FormatSql("{0}", tbcol.Comment)); sb.Append(","); } if (tb.Primarys.Any()) {