codefirst 根据代码注释,迁移到数据库备注

This commit is contained in:
28810 2019-06-14 18:14:14 +08:00
parent 38d51a809d
commit 5ce51bc310
9 changed files with 452 additions and 0 deletions

View File

@ -6,6 +6,10 @@
<IsPackable>false</IsPackable> <IsPackable>false</IsPackable>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
<DocumentationFile>FreeSql.Tests.xml</DocumentationFile>
</PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="FreeSql.DbContext" Version="0.6.4.1" /> <PackageReference Include="FreeSql.DbContext" Version="0.6.4.1" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="2.1.8" /> <PackageReference Include="Microsoft.EntityFrameworkCore" Version="2.1.8" />

View File

@ -0,0 +1,198 @@
<?xml version="1.0"?>
<doc>
<assembly>
<name>FreeSql.Tests</name>
</assembly>
<members>
<member name="M:FreeSql.Tests.MySql.MySqlCodeFirstTest.Tb_alltype.Save">
<summary>
保存或添加,如果主键有值则尝试 Update如果影响的行为 0 则尝试 Insert
</summary>
</member>
<member name="T:FreeSql.Tests.UnitTest1.NewsArticle">
<summary>
</summary>
</member>
<member name="P:FreeSql.Tests.UnitTest1.NewsArticle.ArticleId">
<summary>
</summary>
</member>
<member name="P:FreeSql.Tests.UnitTest1.NewsArticle.ArticleTitle">
<summary>
</summary>
</member>
<member name="P:FreeSql.Tests.UnitTest1.NewsArticle.CategoryId">
<summary>
</summary>
</member>
<member name="P:FreeSql.Tests.UnitTest1.NewsArticle.ChannelId">
<summary>
</summary>
</member>
<member name="P:FreeSql.Tests.UnitTest1.NewsArticle.TypeId">
<summary>
类型
</summary>
</member>
<member name="P:FreeSql.Tests.UnitTest1.NewsArticle.Summary">
<summary>
内容简介
</summary>
</member>
<member name="P:FreeSql.Tests.UnitTest1.NewsArticle.Thumbnail">
<summary>
缩略图
</summary>
</member>
<member name="P:FreeSql.Tests.UnitTest1.NewsArticle.Hits">
<summary>
点击量
</summary>
</member>
<member name="P:FreeSql.Tests.UnitTest1.NewsArticle.IsDisplay">
<summary>
</summary>
</member>
<member name="P:FreeSql.Tests.UnitTest1.NewsArticle.Status">
<summary>
</summary>
</member>
<member name="P:FreeSql.Tests.UnitTest1.NewsArticle.CreateTime">
<summary>
</summary>
</member>
<member name="P:FreeSql.Tests.UnitTest1.NewsArticle.ReleaseTime">
<summary>
</summary>
</member>
<member name="P:FreeSql.Tests.UnitTest1.Templates.Id">
<summary>
主键ID
</summary>
</member>
<member name="T:FreeSql.Tests.ExamPaper">
<summary>
试卷表
</summary>
</member>
<member name="P:FreeSql.Tests.ExamPaper.AssessmentPlanId">
<summary>
考核计划ID
</summary>
</member>
<member name="P:FreeSql.Tests.ExamPaper.TotalScore">
<summary>
总分
</summary>
</member>
<member name="P:FreeSql.Tests.UnitTest2.SysModulePermission.SysModulePermissionId">
<summary>
菜单权限ID
</summary>
</member>
<member name="P:FreeSql.Tests.UnitTest2.SysModulePermission.SysModuleId">
<summary>
菜单主键ID
</summary>
</member>
<member name="P:FreeSql.Tests.UnitTest2.SysModulePermission.SysModuleButtonId">
<summary>
按钮主键ID
</summary>
</member>
<member name="P:FreeSql.Tests.UnitTest2.SysModulePermission.Status">
<summary>
菜单权限
</summary>
</member>
<member name="P:FreeSql.Tests.UnitTest2.SysModule.SysModuleId">
<summary>
主键
</summary>
</member>
<member name="P:FreeSql.Tests.UnitTest2.SysModule.ParentId">
<summary>
父级ID
</summary>
</member>
<member name="P:FreeSql.Tests.UnitTest2.SysModule.Name">
<summary>
名称
</summary>
</member>
<member name="P:FreeSql.Tests.UnitTest2.SysModule.Icon">
<summary>
图标
</summary>
</member>
<member name="P:FreeSql.Tests.UnitTest2.SysModule.UrlAddress">
<summary>
链接地址
</summary>
</member>
<member name="P:FreeSql.Tests.UnitTest2.SysModule.IsShow">
<summary>
是否公开
</summary>
</member>
<member name="P:FreeSql.Tests.UnitTest2.SysModule.Sort">
<summary>
排序
</summary>
</member>
<member name="P:FreeSql.Tests.UnitTest2.SysModule.Description">
<summary>
备注
</summary>
</member>
<member name="P:FreeSql.Tests.UnitTest2.SysModule.CreateTime">
<summary>
创建日期
</summary>
</member>
<member name="P:FreeSql.Tests.UnitTest2.SysModuleButton.SysModuleButtonId">
<summary>
按钮主键
</summary>
</member>
<member name="P:FreeSql.Tests.UnitTest2.SysModuleButton.Name">
<summary>
名称
</summary>
</member>
<member name="P:FreeSql.Tests.UnitTest2.SysModuleButton.EventName">
<summary>
事件名称
</summary>
</member>
<member name="P:FreeSql.Tests.UnitTest2.SysModuleButton.EnCode">
<summary>
编码
</summary>
</member>
<member name="P:FreeSql.Tests.UnitTest2.SysModuleButton.Icon">
<summary>
图标
</summary>
</member>
<member name="P:FreeSql.Tests.UnitTest2.SysModuleButton.Sort">
<summary>
排序
</summary>
</member>
<member name="P:FreeSql.Tests.UnitTest2.SysModuleButton.CreateTime">
<summary>
创建日期
</summary>
</member>
</members>
</doc>

View File

@ -231,6 +231,9 @@ namespace FreeSql.Tests {
public virtual TaskBuild TaskBuild { get; set; } public virtual TaskBuild TaskBuild { get; set; }
} }
public class Templates { public class Templates {
/// <summary>
/// 主键ID
/// </summary>
[Column(IsPrimary = true)] [Column(IsPrimary = true)]
public Guid Id { get; set; } public Guid Id { get; set; }
public string Title { get; set; } public string Title { get; set; }
@ -267,6 +270,10 @@ namespace FreeSql.Tests {
[Fact] [Fact]
public void Test1() { public void Test1() {
var dkdkdkd = g.mysql.Select<Templates>().ToList();
var testaddlist = new List<NewsArticle>(); var testaddlist = new List<NewsArticle>();
for(var a = 0; a < 133905; a++) { for(var a = 0; a < 133905; a++) {
testaddlist.Add(new NewsArticle { testaddlist.Add(new NewsArticle {

198
FreeSql.Tests/ftTests.xml Normal file
View File

@ -0,0 +1,198 @@
<?xml version="1.0"?>
<doc>
<assembly>
<name>FreeSql.Tests</name>
</assembly>
<members>
<member name="M:FreeSql.Tests.MySql.MySqlCodeFirstTest.Tb_alltype.Save">
<summary>
保存或添加,如果主键有值则尝试 Update如果影响的行为 0 则尝试 Insert
</summary>
</member>
<member name="T:FreeSql.Tests.UnitTest1.NewsArticle">
<summary>
</summary>
</member>
<member name="P:FreeSql.Tests.UnitTest1.NewsArticle.ArticleId">
<summary>
</summary>
</member>
<member name="P:FreeSql.Tests.UnitTest1.NewsArticle.ArticleTitle">
<summary>
</summary>
</member>
<member name="P:FreeSql.Tests.UnitTest1.NewsArticle.CategoryId">
<summary>
</summary>
</member>
<member name="P:FreeSql.Tests.UnitTest1.NewsArticle.ChannelId">
<summary>
</summary>
</member>
<member name="P:FreeSql.Tests.UnitTest1.NewsArticle.TypeId">
<summary>
类型
</summary>
</member>
<member name="P:FreeSql.Tests.UnitTest1.NewsArticle.Summary">
<summary>
内容简介
</summary>
</member>
<member name="P:FreeSql.Tests.UnitTest1.NewsArticle.Thumbnail">
<summary>
缩略图
</summary>
</member>
<member name="P:FreeSql.Tests.UnitTest1.NewsArticle.Hits">
<summary>
点击量
</summary>
</member>
<member name="P:FreeSql.Tests.UnitTest1.NewsArticle.IsDisplay">
<summary>
</summary>
</member>
<member name="P:FreeSql.Tests.UnitTest1.NewsArticle.Status">
<summary>
</summary>
</member>
<member name="P:FreeSql.Tests.UnitTest1.NewsArticle.CreateTime">
<summary>
</summary>
</member>
<member name="P:FreeSql.Tests.UnitTest1.NewsArticle.ReleaseTime">
<summary>
</summary>
</member>
<member name="P:FreeSql.Tests.UnitTest1.Templates.Id">
<summary>
主键ID
</summary>
</member>
<member name="T:FreeSql.Tests.ExamPaper">
<summary>
试卷表
</summary>
</member>
<member name="P:FreeSql.Tests.ExamPaper.AssessmentPlanId">
<summary>
考核计划ID
</summary>
</member>
<member name="P:FreeSql.Tests.ExamPaper.TotalScore">
<summary>
总分
</summary>
</member>
<member name="P:FreeSql.Tests.UnitTest2.SysModulePermission.SysModulePermissionId">
<summary>
菜单权限ID
</summary>
</member>
<member name="P:FreeSql.Tests.UnitTest2.SysModulePermission.SysModuleId">
<summary>
菜单主键ID
</summary>
</member>
<member name="P:FreeSql.Tests.UnitTest2.SysModulePermission.SysModuleButtonId">
<summary>
按钮主键ID
</summary>
</member>
<member name="P:FreeSql.Tests.UnitTest2.SysModulePermission.Status">
<summary>
菜单权限
</summary>
</member>
<member name="P:FreeSql.Tests.UnitTest2.SysModule.SysModuleId">
<summary>
主键
</summary>
</member>
<member name="P:FreeSql.Tests.UnitTest2.SysModule.ParentId">
<summary>
父级ID
</summary>
</member>
<member name="P:FreeSql.Tests.UnitTest2.SysModule.Name">
<summary>
名称
</summary>
</member>
<member name="P:FreeSql.Tests.UnitTest2.SysModule.Icon">
<summary>
图标
</summary>
</member>
<member name="P:FreeSql.Tests.UnitTest2.SysModule.UrlAddress">
<summary>
链接地址
</summary>
</member>
<member name="P:FreeSql.Tests.UnitTest2.SysModule.IsShow">
<summary>
是否公开
</summary>
</member>
<member name="P:FreeSql.Tests.UnitTest2.SysModule.Sort">
<summary>
排序
</summary>
</member>
<member name="P:FreeSql.Tests.UnitTest2.SysModule.Description">
<summary>
备注
</summary>
</member>
<member name="P:FreeSql.Tests.UnitTest2.SysModule.CreateTime">
<summary>
创建日期
</summary>
</member>
<member name="P:FreeSql.Tests.UnitTest2.SysModuleButton.SysModuleButtonId">
<summary>
按钮主键
</summary>
</member>
<member name="P:FreeSql.Tests.UnitTest2.SysModuleButton.Name">
<summary>
名称
</summary>
</member>
<member name="P:FreeSql.Tests.UnitTest2.SysModuleButton.EventName">
<summary>
事件名称
</summary>
</member>
<member name="P:FreeSql.Tests.UnitTest2.SysModuleButton.EnCode">
<summary>
编码
</summary>
</member>
<member name="P:FreeSql.Tests.UnitTest2.SysModuleButton.Icon">
<summary>
图标
</summary>
</member>
<member name="P:FreeSql.Tests.UnitTest2.SysModuleButton.Sort">
<summary>
排序
</summary>
</member>
<member name="P:FreeSql.Tests.UnitTest2.SysModuleButton.CreateTime">
<summary>
创建日期
</summary>
</member>
</members>
</doc>

View File

@ -2270,6 +2270,13 @@
<param name="database"></param> <param name="database"></param>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:FreeSql.Internal.CommonUtils.GetProperyCommentBySummary(System.Type)">
<summary>
通过属性的注释文本,通过 xml 读取
</summary>
<param name="type"></param>
<returns>Dictkey=属性名value=注释</returns>
</member>
<member name="P:FreeSql.Internal.Model.TableRef.RefMiddleEntityType"> <member name="P:FreeSql.Internal.Model.TableRef.RefMiddleEntityType">
<summary> <summary>
中间表,多对多 中间表,多对多

View File

@ -8,11 +8,14 @@ using System.Collections;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using System.Collections.Generic; using System.Collections.Generic;
using System.Data.Common; using System.Data.Common;
using System.IO;
using System.Linq; using System.Linq;
using System.Linq.Expressions; using System.Linq.Expressions;
using System.Reflection; using System.Reflection;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Xml;
using System.Xml.XPath;
namespace FreeSql.Internal { namespace FreeSql.Internal {
public abstract class CommonUtils { 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(); return iidx == 1 ? sb.Remove(0, 5).Remove(sb.Length - 1, 1).ToString() : sb.Remove(0, 4).ToString();
} }
/// <summary>
/// 通过属性的注释文本,通过 xml 读取
/// </summary>
/// <param name="type"></param>
/// <returns>Dictkey=属性名value=注释</returns>
public static Dictionary<string, string> GetProperyCommentBySummary(Type type) {
var xmlPath = type.Assembly.Location.Replace(".dll", ".xml");
if (File.Exists(xmlPath) == false) return null;
var dic = new Dictionary<string, string>();
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<DbConnection> pool, int minPoolSize) { public static void PrevReheatConnectionPool(ObjectPool<DbConnection> pool, int minPoolSize) {
if (minPoolSize <= 0) minPoolSize = Math.Min(5, pool.Policy.PoolSize); if (minPoolSize <= 0) minPoolSize = Math.Min(5, pool.Policy.PoolSize);
if (minPoolSize > pool.Policy.PoolSize) minPoolSize = pool.Policy.PoolSize; if (minPoolSize > pool.Policy.PoolSize) minPoolSize = pool.Policy.PoolSize;

View File

@ -10,6 +10,7 @@ namespace FreeSql.Internal.Model {
public string CsName { get; set; } public string CsName { get; set; }
public Type CsType { get; set; } public Type CsType { get; set; }
public ColumnAttribute Attribute { get; set; } public ColumnAttribute Attribute { get; set; }
public string Comment { get; internal set; }
static ConcurrentDictionary<ColumnInfo, Func<object, object>> _dicGetMapValue = new ConcurrentDictionary<ColumnInfo, Func<object, object>>(); static ConcurrentDictionary<ColumnInfo, Func<object, object>> _dicGetMapValue = new ConcurrentDictionary<ColumnInfo, Func<object, object>>();
public object GetMapValue(object obj) { public object GetMapValue(object obj) {

View File

@ -56,6 +56,7 @@ namespace FreeSql.Internal {
if (tbattr != null) trytb.DisableSyncStructure = tbattr.DisableSyncStructure; if (tbattr != null) trytb.DisableSyncStructure = tbattr.DisableSyncStructure;
var propsLazy = new List<(PropertyInfo, bool, bool)>(); var propsLazy = new List<(PropertyInfo, bool, bool)>();
var propsNavObjs = new List<PropertyInfo>(); var propsNavObjs = new List<PropertyInfo>();
var propsComment = CommonUtils.GetProperyCommentBySummary(entity);
foreach (var p in trytb.Properties.Values) { foreach (var p in trytb.Properties.Values) {
var setMethod = trytb.Type.GetMethod($"set_{p.Name}"); var setMethod = trytb.Type.GetMethod($"set_{p.Name}");
var colattr = common.GetEntityColumnAttribute(entity, p); var colattr = common.GetEntityColumnAttribute(entity, p);
@ -124,6 +125,8 @@ namespace FreeSql.Internal {
CsType = p.PropertyType, CsType = p.PropertyType,
Attribute = colattr Attribute = colattr
}; };
if (propsComment != null && propsComment.TryGetValue(p.Name, out var trycomment))
col.Comment = trycomment;
if (colattr.IsIgnore) { if (colattr.IsIgnore) {
trytb.ColumnsByCsIgnore.Add(p.Name, col); trytb.ColumnsByCsIgnore.Add(p.Name, col);
continue; continue;

View File

@ -119,6 +119,7 @@ namespace FreeSql.MySql {
sb.Append(" \r\n ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" "); sb.Append(" \r\n ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" ");
sb.Append(tbcol.Attribute.DbType); sb.Append(tbcol.Attribute.DbType);
if (tbcol.Attribute.IsIdentity == true && tbcol.Attribute.DbType.IndexOf("AUTO_INCREMENT", StringComparison.CurrentCultureIgnoreCase) == -1) sb.Append(" AUTO_INCREMENT"); 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(","); sb.Append(",");
} }
if (tb.Primarys.Any()) { if (tb.Primarys.Any()) {