diff --git a/docs/404.html b/docs/404.html index 3192a15efd8..12413aca460 100644 --- a/docs/404.html +++ b/docs/404.html @@ -8,14 +8,14 @@ Page Not Found | Furion - +
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️
Skip to main content

Page Not Found

We could not find what you were looking for.

Please contact the owner of the site that linked you to the original URL and let them know their link is broken.

- + \ No newline at end of file diff --git a/docs/assets/js/1c2c7d62.3c0db45f.js b/docs/assets/js/1c2c7d62.679e2f63.js similarity index 62% rename from docs/assets/js/1c2c7d62.3c0db45f.js rename to docs/assets/js/1c2c7d62.679e2f63.js index 9ce35592776..3ea205f94b7 100644 --- a/docs/assets/js/1c2c7d62.3c0db45f.js +++ b/docs/assets/js/1c2c7d62.679e2f63.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[17],{205:function(e,n,r){"use strict";r.d(n,"a",(function(){return u})),r.d(n,"b",(function(){return f}));var t=r(0),o=r.n(t);function i(e,n,r){return n in e?Object.defineProperty(e,n,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[n]=r,e}function a(e,n){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(e);n&&(t=t.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),r.push.apply(r,t)}return r}function s(e){for(var n=1;n=0||(o[r]=e[r]);return o}(e,n);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(t=0;t=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var c=o.a.createContext({}),l=function(e){var n=o.a.useContext(c),r=n;return e&&(r="function"==typeof e?e(n):s(s({},n),e)),r},u=function(e){var n=l(e.components);return o.a.createElement(c.Provider,{value:n},e.children)},d={inlineCode:"code",wrapper:function(e){var n=e.children;return o.a.createElement(o.a.Fragment,{},n)}},b=o.a.forwardRef((function(e,n){var r=e.components,t=e.mdxType,i=e.originalType,a=e.parentName,c=p(e,["components","mdxType","originalType","parentName"]),u=l(r),b=t,f=u["".concat(a,".").concat(b)]||u[b]||d[b]||i;return r?o.a.createElement(f,s(s({ref:n},c),{},{components:r})):o.a.createElement(f,s({ref:n},c))}));function f(e,n){var r=arguments,t=n&&n.mdxType;if("string"==typeof e||t){var i=r.length,a=new Array(i);a[0]=b;var s={};for(var p in n)hasOwnProperty.call(n,p)&&(s[p]=n[p]);s.originalType=e,s.mdxType="string"==typeof e?e:t,a[1]=s;for(var c=2;c(u => u.Id == 1);\nvar expression2 = LinqExpression.Create((u,i) => u.Id ==1 && i > 0);\n")),Object(i.b)("h2",{id:"52-\u62fc\u63a5\u4e24\u4e2a\u8868\u8fbe\u5f0f"},"5.2 \u62fc\u63a5\u4e24\u4e2a\u8868\u8fbe\u5f0f"),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre",className:"language-cs"},"var expression = LinqExpression.And(expression1, expression2);\nvar expression2 = LinqExpression.IndexAnd(expression1, expression2);\nvar expression3 = LinqExpression.Or(expression2, expression3);\nvar expression4 = LinqExpression.IndexOr(expression2, expression3);\n")))}l.isMDXComponent=!0}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[17],{205:function(e,n,r){"use strict";r.d(n,"a",(function(){return u})),r.d(n,"b",(function(){return f}));var t=r(0),o=r.n(t);function i(e,n,r){return n in e?Object.defineProperty(e,n,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[n]=r,e}function a(e,n){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(e);n&&(t=t.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),r.push.apply(r,t)}return r}function s(e){for(var n=1;n=0||(o[r]=e[r]);return o}(e,n);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(t=0;t=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var c=o.a.createContext({}),l=function(e){var n=o.a.useContext(c),r=n;return e&&(r="function"==typeof e?e(n):s(s({},n),e)),r},u=function(e){var n=l(e.components);return o.a.createElement(c.Provider,{value:n},e.children)},d={inlineCode:"code",wrapper:function(e){var n=e.children;return o.a.createElement(o.a.Fragment,{},n)}},b=o.a.forwardRef((function(e,n){var r=e.components,t=e.mdxType,i=e.originalType,a=e.parentName,c=p(e,["components","mdxType","originalType","parentName"]),u=l(r),b=t,f=u["".concat(a,".").concat(b)]||u[b]||d[b]||i;return r?o.a.createElement(f,s(s({ref:n},c),{},{components:r})):o.a.createElement(f,s({ref:n},c))}));function f(e,n){var r=arguments,t=n&&n.mdxType;if("string"==typeof e||t){var i=r.length,a=new Array(i);a[0]=b;var s={};for(var p in n)hasOwnProperty.call(n,p)&&(s[p]=n[p]);s.originalType=e,s.mdxType="string"==typeof e?e:t,a[1]=s;for(var c=2;c(u => u.Id == 1);\nvar expression2 = LinqExpression.Create((u,i) => u.Id == 1 && i > 0);\n")),Object(i.b)("h2",{id:"52-\u62fc\u63a5\u4e24\u4e2a\u8868\u8fbe\u5f0f"},"5.2 \u62fc\u63a5\u4e24\u4e2a\u8868\u8fbe\u5f0f"),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre",className:"language-cs"},"// \u521b\u5efa\u4e00\u4e2a\u521d\u59cb\u5316\u7684\u8868\u8fbe\u5f0f\nvar expression = LinqExpression.And();\nvar expression2 = LinqExpression.IndexAnd();\nvar expression3 = LinqExpression.Or();\nvar expression4 = LinqExpression.IndexOr();\n\n// \u62fc\u63a5\u8868\u8fbe\u5f0f\nvar expression5 = expression.Add(expression2);\nvar expression6 = expression.AddIf(age > 18, expression2);\nvar expression7 = expression.Or(expression2);\nvar expression8 = expression.OrIf(age > 18, expression2);\n\n// \u83b7\u53d6\u8868\u8fbe\u5f0f\u5c5e\u6027\u540d\nvar properyName = expression.GetExpressionPropertyName(u => u.Name); // Name\n")))}l.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/docs/assets/js/4c79e569.77da0d74.js b/docs/assets/js/4c79e569.77da0d74.js deleted file mode 100644 index 410d46836d0..00000000000 --- a/docs/assets/js/4c79e569.77da0d74.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[33],{110:function(e,t,a){"use strict";a.r(t),a.d(t,"frontMatter",(function(){return r})),a.d(t,"metadata",(function(){return l})),a.d(t,"toc",(function(){return c})),a.d(t,"default",(function(){return o}));var i=a(3),n=a(7),b=(a(0),a(205)),r=(a(10),{id:"upgrade",title:"1.6 \u66f4\u65b0\u65e5\u5fd7",sidebar_label:"1.6 \u66f4\u65b0\u65e5\u5fd7"}),l={unversionedId:"upgrade",id:"upgrade",isDocsHomePage:!1,title:"1.6 \u66f4\u65b0\u65e5\u5fd7",description:"\u6b64\u7ae0\u8282\u53ea\u8bb0\u5f55\u91cd\u5927\u7248\u672c\u66f4\u65b0\u65e5\u5fd7\uff0c\u5c0f\u8fed\u4ee3\u7248\u672c\u4e0d\u505a\u66f4\u65b0\u3002\u60f3\u4e86\u89e3\u66f4\u591a\u66f4\u65b0\u5185\u5bb9\uff0c\u53ef\u67e5\u9605 CHANGELOG.md",source:"@site/docs/upgrade.mdx",slug:"/upgrade",permalink:"/docs/upgrade",editUrl:"https://gitee.com/dotnetchina/Furion/tree/master/handbook/docs/upgrade.mdx",version:"current",lastUpdatedBy:"Monk",lastUpdatedAt:1616487095,formattedLastUpdatedAt:"3/23/2021",sidebar_label:"1.6 \u66f4\u65b0\u65e5\u5fd7",sidebar:"docs",previous:{title:"1.5 \u8d5e\u52a9 Furion",permalink:"/docs/donate"},next:{title:"2.1 \u4e00\u5206\u949f\u4e0a\u624b",permalink:"/docs/get-start"}},c=[{value:"v1.16.0 \uff08\u5f53\u524d\u7248\u672c\uff09",id:"v1160-\uff08\u5f53\u524d\u7248\u672c\uff09",children:[]},{value:"v1.15.0 \uff08\u5df2\u53d1\u5e03\uff09",id:"v1150-\uff08\u5df2\u53d1\u5e03\uff09",children:[]},{value:"v1.14.0\uff08\u5df2\u53d1\u5e03\uff09",id:"v1140\uff08\u5df2\u53d1\u5e03\uff09",children:[]},{value:"v1.13.0\uff08\u5df2\u53d1\u5e03\uff09",id:"v1130\uff08\u5df2\u53d1\u5e03\uff09",children:[]},{value:"v1.7.0\uff08\u5df2\u53d1\u5e03\uff09",id:"v170\uff08\u5df2\u53d1\u5e03\uff09",children:[]},{value:"v1.4.0\uff08\u5df2\u53d1\u5e03\uff09",id:"v140\uff08\u5df2\u53d1\u5e03\uff09",children:[]},{value:"v1.2.0\uff08\u5df2\u53d1\u5e03\uff09",id:"v120\uff08\u5df2\u53d1\u5e03\uff09",children:[]},{value:"v1.1.0\uff08\u5df2\u53d1\u5e03\uff09",id:"v110\uff08\u5df2\u53d1\u5e03\uff09",children:[]},{value:"v1.0.3\uff08\u5df2\u53d1\u5e03\uff09",id:"v103\uff08\u5df2\u53d1\u5e03\uff09",children:[]},{value:"v1.0.2\uff08\u5df2\u53d1\u5e03\uff09",id:"v102\uff08\u5df2\u53d1\u5e03\uff09",children:[]},{value:"v1.0.0\uff08\u5df2\u53d1\u5e03\uff09",id:"v100\uff08\u5df2\u53d1\u5e03\uff09",children:[]}],p={toc:c};function o(e){var t=e.components,a=Object(n.a)(e,["components"]);return Object(b.b)("wrapper",Object(i.a)({},p,a,{components:t,mdxType:"MDXLayout"}),Object(b.b)("p",null,Object(b.b)("strong",{parentName:"p"},"\u6b64\u7ae0\u8282\u53ea\u8bb0\u5f55\u91cd\u5927\u7248\u672c\u66f4\u65b0\u65e5\u5fd7\uff0c\u5c0f\u8fed\u4ee3\u7248\u672c\u4e0d\u505a\u66f4\u65b0\u3002"),"\u60f3\u4e86\u89e3\u66f4\u591a\u66f4\u65b0\u5185\u5bb9\uff0c\u53ef\u67e5\u9605 ",Object(b.b)("a",{parentName:"p",href:"https://gitee.com/dotnetchina/Furion/blob/master/CHANGELOG.md"},"CHANGELOG.md")),Object(b.b)("h2",{id:"v1160-\uff08\u5f53\u524d\u7248\u672c\uff09"},"v1.16.0 \uff08\u5f53\u524d\u7248\u672c\uff09"),Object(b.b)("ul",null,Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u65b0\u7279\u6027")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"IDGenerator")," \u96ea\u82b1 ID \u7b97\u6cd5\uff0c\u611f\u8c22 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/yitter/idgenerator"},"idgenerator")," \u4f5c\u8005\u63d0\u4ea4 PR ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/pulls/204"},"#PR204")," ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I3B60S"},"#I3B60S")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"DbContext")," \u5237\u65b0\u591a\u79df\u6237\u7f13\u5b58\u62d3\u5c55\u65b9\u6cd5 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I39N5U"},"#I39N5U")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u81ea\u5b9a\u4e49\u914d\u7f6e\u5355\u4e2a\u63a7\u5236\u5668\u540d\u79f0\u89c4\u8303\uff0c\u5982\u5c0f\u5199\u8def\u7531 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I3A5XL"},"#I3A5XL")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u83b7\u53d6\u5f53\u524d\u9009\u62e9\u533a\u57df\u8bed\u8a00\u65b9\u6cd5 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I3BSDH"},"#I3BSDH")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u7a81\u7834\u6027\u53d8\u5316")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u5347\u7ea7]"," .NET 5 SDK \u81f3 5.0.4 \u7248\u672c ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I3ASTL"},"#I3ASTL")),Object(b.b)("li",{parentName:"ul"},"[\u91cd\u6784]"," \u8fdc\u7a0b\u8bf7\u6c42\u6240\u6709\u529f\u80fd ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2LB7M"},"#I2LB7M")),Object(b.b)("li",{parentName:"ul"},"[\u91cd\u6784]"," ",Object(b.b)("inlineCode",{parentName:"li"},"JSON")," \u5e8f\u5217\u5316\u529f\u80fd\uff0c\u63d0\u4f9b\u7edf\u4e00\u7684\u62bd\u8c61\u63a5\u53e3\uff0c\u65b9\u4fbf\u81ea\u7531\u66ff\u6362 ",Object(b.b)("inlineCode",{parentName:"li"},"JSON")," \u5e93 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I39GT9"},"#I39GT9")),Object(b.b)("li",{parentName:"ul"},"[\u91cd\u6784]"," \u9a8c\u8bc1\u5931\u8d25\u8fd4\u56de\u6d88\u606f\u6a21\u578b\u53ca\u89c4\u8303\u5316\u63a5\u53e3\u9a8c\u8bc1\u53c2\u6570 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I3AFQW"},"#I3AFQW")),Object(b.b)("li",{parentName:"ul"},"[\u4f18\u5316]"," \u63d2\u4ef6\u5f0f\u5f00\u53d1\u70ed\u63d2\u62d4\u529f\u80fd\uff0c\u5b9e\u73b0\u52a8\u6001\u52a0\u8f7d\u5378\u8f7d ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/pulls/200"},"#PR200"),", \u611f\u8c22 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/samwangcoder"},"@SamWangCoder")),Object(b.b)("li",{parentName:"ul"},"[\u79fb\u9664]"," \u79fb\u9664 ",Object(b.b)("inlineCode",{parentName:"li"},"JsonSerializerUtility")," \u9759\u6001\u7c7b\u53ca\u79fb\u9664\u5c5e\u6027\u5927\u5199\u5e8f\u5217\u5316\u62d3\u5c55\u914d\u7f6e ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I3AFRJ"},"#I3AFRJ")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u95ee\u9898\u4fee\u590d")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"MVC")," \u6a21\u5f0f\u4e0b\u4e0d\u652f\u6301\u9a8c\u8bc1\u81ea\u5b9a\u4e49\u9a8c\u8bc1\u903b\u8f91 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I39LM5"},"#I39LM5")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u9a8c\u8bc1\u6570\u503c\u7c7b\u578b\u6b63\u5219\u8868\u8fbe\u5f0f\u4e0d\u652f\u6301\u8d1f\u6570 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I39YUV"},"#I39YUV")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u6846\u67b6\u542f\u52a8\u65f6\u65e0\u6cd5\u52a0\u8f7d\u672a\u88ab\u5f15\u7528\u7684\u7a0b\u5e8f\u96c6 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I3A3Z4"},"#I3A3Z4")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"EFCoreRepository.IsAttached()")," \u65b9\u6cd5\u5224\u65ad\u9519\u8bef bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I3A824"},"#I3A824")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"\u52a8\u6001API")," \u9a7c\u5cf0\u663e\u793a\u914d\u7f6e\u65e0\u6548 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I3AF32"},"#I3AF32")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"cli.ps1")," \u4e0d\u652f\u6301\u65b0\u7248\u672c ",Object(b.b)("inlineCode",{parentName:"li"},"EFCore")," bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I3APO9"},"#I3APO9")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"EFCore")," \u5b9e\u4f53\u914d\u7f6e ",Object(b.b)("inlineCode",{parentName:"li"},"[Table]")," \u7279\u6027\u65e0\u6548 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I3BAYH"},"#I3BAYH")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u52a8\u6001 WebAPI ",Object(b.b)("inlineCode",{parentName:"li"},"CheckIsSplitCamelCase")," bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I3BLKX"},"#I3BLKX")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u4fee\u590d\u52a8\u6001 WebAPI \u914d\u7f6e\u4fdd\u7559 Action \u7684 Async \u540e\u7f00\u65e0\u6548\u95ee\u9898 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I3C3DA"},"#I3C3DA")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"JWT")," Token \u5237\u65b0\u540e\u65e7\u7684\u5237\u65b0 Token \u4f9d\u65e7\u53ef\u7528 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I3C8ZH"},"#I3C8ZH")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u591a\u8bed\u8a00 ",Object(b.b)("inlineCode",{parentName:"li"},"Razor")," \u89c6\u56fe\u53d8\u91cf\u591a\u8bed\u8a00\u4e71\u7801\u95ee\u9898 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I3CBMU"},"#I3CBMU")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u5176\u4ed6\u66f4\u6539")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u4f18\u5316]"," \u9ed8\u8ba4\u5e8f\u5217\u5316\u63d0\u4f9b\u5668 ",Object(b.b)("inlineCode",{parentName:"li"},"System.Text.Json")," \u53cd\u5e8f\u5217\u5316\u5b57\u7b26\u4e32\u65f6\u533a\u5206\u5927\u5c0f\u5199\u95ee\u9898 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I3BSXV"},"#I3BSXV")),Object(b.b)("li",{parentName:"ul"},"[\u4f18\u5316]"," \u4f18\u5316 ",Object(b.b)("inlineCode",{parentName:"li"},"MessageCenter")," \u6027\u80fd\u95ee\u9898 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I39PRR"},"#I39PRR")),Object(b.b)("li",{parentName:"ul"},"[\u4f18\u5316]"," \u6570\u636e\u5e93\u4e0a\u4e0b\u6587\u6c60\u5c0f\u6027\u80fd\u4f18\u5316"))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u6587\u6863\u53d8\u5316")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Docker")," \u73af\u5883\u4e0b\u81ea\u52a8\u5316\u90e8\u7f72 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/pulls/209"},"#PR209")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"JSON")," \u5e8f\u5217\u5316 \u6587\u6863 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I3B6D8"},"#I3B6D8")),Object(b.b)("li",{parentName:"ul"},"[\u66f4\u65b0]"," \u8de8\u57df\u3001\u5b89\u5168\u6388\u6743\u3001\u5373\u65f6\u901a\u4fe1\u6587\u6863\u3001\u591a\u8bed\u8a00\u3001\u89c4\u8303\u5316\u6587\u6863"))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u95ee\u7b54\u7b54\u7591")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Furion.Extras.DatabaseAccessor.SqlSugar")," \u914d\u7f6e\u591a\u4e2a\u6570\u636e\u5e93\u6253\u5370 SQL \u8bed\u53e5\u95ee\u9898 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I39PDC"},"#I39PDC")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(b.b)("inlineCode",{parentName:"li"},"ORACLE")," \u6570\u636e\u5e93\u591a\u79df\u6237\u6a21\u5f0f\u4e0b\u8fd4\u56de\u503c\u4e3a\u6307\u5b9a\u7c7b\u578b\u65f6\u7cfb\u7edf\u5361\u6b7b ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I39RNH"},"#I39RNH")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u5047\u5220\u9664\u6307\u5411\u5f02\u5e38 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I39XZA"},"#I39XZA")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Furion")," \u591a\u8bed\u8a00\u914d\u7f6e\u8282\u662f\u653e\u5728 ",Object(b.b)("inlineCode",{parentName:"li"},"AppSettings")," \u91cc\u9762\u8fd8\u662f\u5916\u9762\u5462\uff1f ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I3A4SB"},"#I3A4SB")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u6ca1\u627e\u5230\u6570\u636e\u5e93\u4e0a\u4e0b\u6587 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I3A5HS"},"#I3A5HS")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u6709 ",Object(b.b)("inlineCode",{parentName:"li"},"QQ")," \u4ea4\u6d41\u7fa4\u5417\uff1f ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I3AAM7"},"#I3AAM7")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Vue3")," \u73af\u5883\u4e0b\u914d\u7f6e ",Object(b.b)("inlineCode",{parentName:"li"},"SignalR")," \u8de8\u57df\u51fa\u9519 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I3ALQ7"},"#I3ALQ7")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u8bbe\u7f6e ",Object(b.b)("inlineCode",{parentName:"li"},"Swagger")," \u53c2\u6570\u975e\u5fc5\u586b ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I3AT02"},"#I3AT02")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," EFCore \u8c03\u7528 Insert \u65f6\u62a5 ",Object(b.b)("inlineCode",{parentName:"li"},"Unknown column 'Discriminator' in 'field list'")," \u5f02\u5e38 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I3B2LC"},"#I3B2LC")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u9006\u5411 ",Object(b.b)("inlineCode",{parentName:"li"},"mysql")," \u6570\u636e\u5e93\u65f6 ",Object(b.b)("inlineCode",{parentName:"li"},"cli")," \u51fa\u73b0\u9519\u8bef ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I3B64F"},"#I3B64F")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," Sql \u9ad8\u7ea7\u4ee3\u7406\u4f7f\u7528\u8fc7\u7a0b\u4e2d DateTime \u7c7b\u578b\u7684\u53c2\u6570\u5e8f\u5217\u5316\u5931\u8d25 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I3AZXK"},"#I3AZXK")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u4f7f\u7528 Mysql \u6267\u884c Add-Migration \u62a5\u9519 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I3B8EW"},"#I3B8EW")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," Saas \u591a\u79df\u6237\u6a21\u5f0f-\u72ec\u7acb Database \u6a21\u5f0f\u4e0b\u65e0\u6cd5\u83b7\u53d6 Tenant, \u5bfc\u81f4\u65e0\u6cd5\u81ea\u52a8\u5207\u6362\u7684\u95ee\u9898",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I3AVXU"},"#I3AVXU")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u5982\u4f55\u81ea\u5b9a\u4e49 WebAPI \u7edf\u4e00\u7ed3\u679c\u6a21\u578b ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I3BBYW"},"#I3BBYW")," ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I3BBYV"},"#I3BBYV")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u5728 ",Object(b.b)("inlineCode",{parentName:"li"},"Web.Entry")," \u9879\u76ee\u65b0\u5efa\u4e86\u4e00\u4e2a ",Object(b.b)("inlineCode",{parentName:"li"},"Controller"),"\uff0c\u591a\u4e86\u672a\u77e5\u65b9\u6cd5 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I3BKH5"},"#I3BKH5")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(b.b)("inlineCode",{parentName:"li"},"AOP")," \u62e6\u622a\u5982\u4f55\u89e3\u6790\u670d\u52a1 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I3BUM3"},"#I3BUM3")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u52a8\u6001 WebAPI \u8fd4\u56de\u53c2\u6570\u88ab\u7701\u7565 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I3C2XR"},"#I3C2XR")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u5982\u4f55\u8bbe\u7f6e\u67d0\u4e00\u4e2a\u63a5\u53e3\u54cd\u5e94\u6570\u636e\u4e0d\u81ea\u52a8\u8f6c\u5c0f\u5199\uff0c\u6309\u539f\u59cb\u5b57\u6bb5\u540d\u8fd4\u56de ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I38L9B"},"#I38L9B")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," code first \u5982\u4f55\u914d\u7f6e\u81ea\u52a8\u8fc1\u79fb ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I3CCR0"},"#I3CCR0")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," webapi \u6df7\u5408\u6388\u6743\u5982\u4f55\u533a\u5206\u4e0d\u540c\u7cfb\u7edf ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I3CJCY"},"#I3CJCY")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," EFCore \u4e0d\u652f\u6301\u9012\u5f52\u65e0\u9650\u7ea7\u904d\u5386\u5173\u7cfb ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I3CET9"},"#I3CET9")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u4e0d\u505a\u5b9e\u73b0")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u5efa\u8bae ",Object(b.b)("inlineCode",{parentName:"li"},"EFCore")," \u53ef\u914d\u7f6e\u5916\u952e\u5173\u7cfb\u5bfc\u822a\u95ee\u9898 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I3994X"},"#I3994X")),Object(b.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u5efa\u8bae\u5c06 ",Object(b.b)("inlineCode",{parentName:"li"},"EFCore")," \u5265\u79bb\u51fa\u6765\uff0c\u4f5c\u4e3a\u63d2\u4ef6\u7684\u5f62\u5f0f\u63d0\u4f9b\u3002\u8fd9\u6837\u53ef\u4ee5\u9009\u62e9\u81ea\u5df1\u559c\u6b22\u7684 ",Object(b.b)("inlineCode",{parentName:"li"},"ORM")," ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I3ABNX"},"#I3ABNX")),Object(b.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u4e8b\u4ef6\u603b\u7ebf\u80fd\u5426\u63d0\u4f9b\u8fd4\u56de\u503c ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I3AWL6"},"#I3AWL6")),Object(b.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," Sql \u6a21\u677f\u80fd\u4eff\u7167 Mybatis \u4e00\u6837\u52a0\u5404\u79cd\u6807\u7b7e\u5417\uff1f",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I3ASRS"},"#I3ASRS")),Object(b.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," EFCore \u66f4\u65b0\u6216\u6392\u9664\u66f4\u65b0\u6307\u5b9a\u5217\u652f\u6301\u4f20\u5165 DTO \u6a21\u578b ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I3AS5K"},"#I3AS5K")),Object(b.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u65b0\u589e ",Object(b.b)("inlineCode",{parentName:"li"},"UnitOfWork")," \u4e8b\u52a1\u5b8c\u6210\u4e8b\u4ef6 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I3BRMI"},"#I3BRMI"))))),Object(b.b)("hr",null),Object(b.b)("h2",{id:"v1150-\uff08\u5df2\u53d1\u5e03\uff09"},"v1.15.0 \uff08\u5df2\u53d1\u5e03\uff09"),Object(b.b)("ul",null,Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u65b0\u7279\u6027")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u8df3\u8fc7\u7279\u5b9a\u5b9e\u4f53\u6570\u636e\u5e93\u64cd\u4f5c\u76d1\u542c\u7279\u6027 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I386LB"},"#I386LB")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"IEntityChangedListener")," \u589e\u52a0\u5bf9 ",Object(b.b)("inlineCode",{parentName:"li"},"OldEntity")," \u7684\u652f\u6301 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I385X2"},"#I385X2")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u5b9e\u65f6\u901a\u4fe1\u81ea\u52a8\u914d\u7f6e\u96c6\u7ebf\u5668\u62d3\u5c55\u53ca\u7279\u6027 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I387QX"},"#I387QX")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Mapster")," \u62d3\u5c55\u652f\u6301 ",Object(b.b)("inlineCode",{parentName:"li"},"IMapper")," \u4f9d\u8d56\u6ce8\u5165\u65b9\u5f0f ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I38C7C"},"#I38C7C")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"[AppDbContext]")," \u7279\u6027\u9ed8\u8ba4\u6784\u9020\u51fd\u6570 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I38J97"},"#I38J97")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"UnifyContext.GetExceptionMetadata(context)")," \u8fd4\u56de\u9519\u8bef\u7801\u652f\u6301 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I38ONX"},"#I38ONX")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u7a81\u7834\u6027\u53d8\u5316"))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u95ee\u9898\u4fee\u590d")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u591a\u6b21\u5faa\u73af\u4e2d\u8c03\u7528 ",Object(b.b)("inlineCode",{parentName:"li"},"Db.GetNewDbContext()")," \u8fd8\u662f\u83b7\u53d6\u5230\u540c\u4e00\u4e2a\u5bf9\u8c61 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I38NNP"},"#I38NNP")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Swagger")," \u8fc7\u6ee4\u6389 ",Object(b.b)("inlineCode",{parentName:"li"},"object ")," \u7c7b\u578b\u5c5e\u6027\u95ee\u9898 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I38FHL"},"#I38FHL")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u540c\u4e00\u7c7b\u4e0d\u652f\u6301\u591a\u7ee7\u627f ",Object(b.b)("inlineCode",{parentName:"li"},"IEntityChangedListener")," \u95ee\u9898 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I38UQJ"},"#I38UQJ")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u81ea\u5b9a\u4e49\u5e8f\u5217\u5316\u5c5e\u6027\u540d\u79f0\u5bfc\u81f4\u9a8c\u8bc1\u5931\u8d25\u5c5e\u6027\u4e0d\u5339\u914d\u95ee\u9898 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I38W8Z"},"#I38W8Z")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u5176\u4ed6\u66f4\u6539")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u4f18\u5316]"," \u4ee3\u7801\u4e0d\u89c4\u8303\u547d\u540d\u5bfc\u81f4\u5f00\u53d1\u8005\u9605\u8bfb\u4ee3\u7801\u65f6\u4ea7\u751f\u6b67\u4e49"))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u6587\u6863\u53d8\u5316")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"FluentValidation")," \u96c6\u6210\u6587\u6863 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I38IOT"},"#I38IOT")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u95ee\u7b54\u7b54\u7591")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Furion")," \u6846\u67b6\u7248\u672c\u5411\u4e0b\u517c\u5bb9\u95ee\u9898 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I38WMZ"},"#I38WMZ")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u4e0d\u505a\u5b9e\u73b0")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u5efa\u8bae ",Object(b.b)("inlineCode",{parentName:"li"},"SqlSugar")," \u6dfb\u52a0\u52a8\u6001\u5207\u6362\u6570\u636e\u5e93\u529f\u80fd ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I38G4M"},"#I38G4M")),Object(b.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u5efa\u8bae ",Object(b.b)("inlineCode",{parentName:"li"},"MessageCenter")," \u91c7\u7528 ",Object(b.b)("inlineCode",{parentName:"li"},"Channel")," \u5b9e\u73b0 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I38BP8"},"#I38BP8")),Object(b.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u5efa\u8bae\u63a5\u53e3\u6587\u6863\u6574\u5408 Knife4jUI \u6216 Redoc ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I38S70"},"#I38S70"))))),Object(b.b)("hr",null),Object(b.b)("h2",{id:"v1140\uff08\u5df2\u53d1\u5e03\uff09"},"v1.14.0\uff08\u5df2\u53d1\u5e03\uff09"),Object(b.b)("ul",null,Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u65b0\u7279\u6027")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"EFCore")," 5.0 \u7684 ",Object(b.b)("inlineCode",{parentName:"li"},"Oracle")," \u6570\u636e\u5e93\u652f\u6301 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I37Z8E"},"#I37Z8E")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u63a7\u5236\u662f\u5426\u5728\u5f00\u53d1\u73af\u5883\u4e0b\u663e\u793a\u6570\u636e\u5e93\u8fde\u63a5\u4fe1\u606f ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I37YQ2"},"#I37YQ2")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"[NonUnify]")," \u652f\u6301\u5728\u7c7b\u4e2d\u8d34\u6b64\u7279\u6027 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I359Q6"},"#I359Q6")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"\u7f51\u7edc\u8bf7\u6c42")," \u5b57\u7b26\u4e32 ",Object(b.b)("inlineCode",{parentName:"li"},"HttpClient")," \u62e6\u622a\u5668 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I35F3E"},"#I35F3E")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"HttpContext")," \u53ca ",Object(b.b)("inlineCode",{parentName:"li"},"HttpRequest")," \u83b7\u53d6\u8fdc\u7a0b\u5730\u5740\u62d3\u5c55 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I3688Z"},"#I3688Z")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"services.AddMvcFilter<>")," \u6dfb\u52a0 ",Object(b.b)("inlineCode",{parentName:"li"},"Mvc")," \u8fc7\u6ee4\u5668\u62d3\u5c55 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I368BH"},"#I368BH")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u7a81\u7834\u6027\u53d8\u5316")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u5347\u7ea7]"," \u6846\u67b6\u4f9d\u8d56\u7684 .NET 5 SDK \u81f3\u6700\u65b0\u7248 5.0.3 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I37YQQ"},"#I37YQQ")),Object(b.b)("li",{parentName:"ul"},"[\u5347\u7ea7]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Swashbuckle.AspNetCore")," \u7ec4\u4ef6\u5305\u5230 ",Object(b.b)("inlineCode",{parentName:"li"},"6.0.x")," \u7248\u672c ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I37EZK"},"#I37EZK")),Object(b.b)("li",{parentName:"ul"},"[\u79fb\u9664]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Furion")," \u6846\u67b6 ",Object(b.b)("inlineCode",{parentName:"li"},"JWT")," \u62d3\u5c55\u7c7b\uff0c\u53ea\u5728 ",Object(b.b)("inlineCode",{parentName:"li"},"Furion.Extras.Authentication.JwtBearer")," \u4e2d\u4fdd\u7559 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I35D59"},"#I35D59")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u95ee\u9898\u4fee\u590d")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u4f20\u5165\u9519\u8bef ",Object(b.b)("inlineCode",{parentName:"li"},"JWT Token")," \u5b57\u7b26\u4e32\u5bfc\u81f4\u81ea\u52a8\u5237\u65b0 ",Object(b.b)("inlineCode",{parentName:"li"},"Token")," \u51fa\u73b0\u5b57\u7b26\u4e32\u8fb9\u754c\u503c\u5f02\u5e38 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I34ZE5"},"#I34ZE5")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u77ac\u65f6\u4f5c\u7528\u57df\u6570\u636e\u5e93\u4e0a\u4e0b\u6587\u4e5f\u4f1a\u81ea\u52a8\u52a0\u5165\u5de5\u4f5c\u5355\u5143\u5bfc\u81f4\u5199\u65e5\u5fd7\u65f6\u8fde\u9501\u5f02\u5e38 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I37WTV"},"#I37WTV")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u5176\u4ed6\u66f4\u6539")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u4f18\u5316]"," \u83b7\u53d6\u7cfb\u7edf\u73af\u5883\u53c2\u6570\u7684\u6027\u80fd ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I36SR5"},"#I36SR5")),Object(b.b)("li",{parentName:"ul"},"[\u4f18\u5316]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Furion")," \u5e95\u5c42\u6dfb\u52a0 ",Object(b.b)("inlineCode",{parentName:"li"},"Mvc")," \u8fc7\u6ee4\u5668\u4ee3\u7801 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I36SKA"},"#I36SKA")),Object(b.b)("li",{parentName:"ul"},"[\u4f18\u5316]"," \u6dfb\u52a0\u9ed8\u8ba4 ",Object(b.b)("inlineCode",{parentName:"li"},"Json")," \u5e8f\u5217\u5316\u65f6\u95f4\u9ed8\u8ba4\u65f6\u95f4\u683c\u5f0f ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I36SL0"},"#I36SL0")),Object(b.b)("li",{parentName:"ul"},"[\u5347\u7ea7]"," \u5347\u7ea7 ",Object(b.b)("inlineCode",{parentName:"li"},"SqlSugar")," \u62d3\u5c55\u5305\u5230 ",Object(b.b)("inlineCode",{parentName:"li"},"5.0.2.6")," \u7248\u672c ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I36SIG"},"#I36SIG")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u6587\u6863\u53d8\u5316")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u6570\u636e\u5e93\u5165\u95e8\u6587\u6863 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I37Z8S"},"#I37Z8S")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u66f4\u65b0\u65e5\u5fd7\u6587\u6863 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I36PI0"},"#I36PI0")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u8bf7\u6c42\u5ba1\u8ba1\u65e5\u5fd7\u3001\u6267\u884c ",Object(b.b)("inlineCode",{parentName:"li"},"Sql")," \u66f4\u65b0\u65e5\u5fd7\u6587\u6863 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I36PIK"},"#I36PIK")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u524d\u7aef\u4f7f\u7528 ",Object(b.b)("inlineCode",{parentName:"li"},"axios")," \u8de8\u57df\u914d\u7f6e\u6587\u6863 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I36PIT"},"#I36PIT")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"App")," \u9759\u6001\u7c7b\u83b7\u53d6\u5e94\u7528\u3001\u73af\u5883\u66f4\u591a\u4fe1\u606f\u6570\u636e ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I36SOV"},"#I36SOV")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u82f1\u6587\u7248 ",Object(b.b)("inlineCode",{parentName:"li"},"README.md")," \u4ecb\u7ecd ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I37QHP"},"#I37QHP")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u95ee\u7b54\u7b54\u7591"))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u4e0d\u505a\u5b9e\u73b0")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u591a\u8bed\u8a00\u8d44\u6e90\u6587\u4ef6\u81ea\u52a8\u521b\u5efa ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I35AA4"},"#I35AA4")),Object(b.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u5efa\u8bae\u591a\u8bed\u8a00\u52a0\u4e0a\u7ef4\u543e\u5c14\u8bed\u652f\u6301 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I37X1L"},"#I37X1L"))))),Object(b.b)("hr",null),Object(b.b)("h2",{id:"v1130\uff08\u5df2\u53d1\u5e03\uff09"},"v1.13.0\uff08\u5df2\u53d1\u5e03\uff09"),Object(b.b)("ul",null,Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u65b0\u7279\u6027")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u591a\u8bed\u8a00\u529f\u80fd\u53ca\u62d3\u5c55 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2DOCL"},"#I2DOCL")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u4e8b\u4ef6\u603b\u7ebf\u529f\u80fd\u53ca\u6d88\u606f\u4e2d\u5fc3 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I23BKN"},"#I23BKN")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Swagger")," \u5206\u7ec4\u663e\u793a\u9690\u85cf\u914d\u7f6e ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2AHH8"},"#I2AHH8")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Furion.Extras.Logging.Serilog")," \u62d3\u5c55\u63d2\u4ef6 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2AAN8"},"#I2AAN8")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"cli.ps")," \u652f\u6301 ",Object(b.b)("inlineCode",{parentName:"li"},"-Namespace")," \u547d\u540d\u7a7a\u95f4\u6307\u5b9a ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2A175"},"#I2A175")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Swagger")," \u89c4\u8303\u5316\u5316\u6587\u6863\u6388\u6743\u5931\u6548\u540e\u81ea\u52a8\u53d6\u6d88\u6388\u6743\u9501 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2AIWC"},"#I2AIWC")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Request.Body")," \u652f\u6301\u91cd\u590d\u8bfb\u529f\u80fd\uff0c\u4e3b\u8981\u89e3\u51b3\u5fae\u4fe1 SDK \u95ee\u9898 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2AMG0"},"#I2AMG0")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u7f51\u7edc\u8bf7\u6c42\u529f\u80fd\u53ca\u6587\u6863 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2APGJ"},"#I2APGJ")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"SqlSugar")," \u62d3\u5c55\u5305\u652f\u6301\u6253\u5370 ",Object(b.b)("inlineCode",{parentName:"li"},"sql")," \u5230 ",Object(b.b)("inlineCode",{parentName:"li"},"MiniProfiler")," \u4e2d ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2ASLS"},"#I2ASLS")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Furion.Extras.DatabaseAccesssor.Dapper")," \u62d3\u5c55\u63d2\u4ef6 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2ASYA"},"#I2ASYA")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Furion.Extras.DatabaseAccessor.PetaPoco")," \u62d3\u5c55\u63d2\u4ef6 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2AUGA"},"#I2AUGA")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u7f51\u7edc\u8bf7\u6c42\u5b57\u7b26\u4e32\u62d3\u5c55\u65b9\u6cd5 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2CPQ0"},"#I2CPQ0")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"SqlSugar")," \u62d3\u5c55\u65b0\u589e ",Object(b.b)("inlineCode",{parentName:"li"},"PagedList")," \u62d3\u5c55 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2CW99"},"#I2CW99")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u8fdc\u7a0b\u8bf7\u6c42\u652f\u6301\u53c2\u6570\u7279\u6027\u9a8c\u8bc1 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2CX5L"},"#I2CX5L")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"App.User")," \u83b7\u53d6\u5f53\u524d\u6388\u6743\u7528\u6237\u4fe1\u606f\u4fbf\u6377\u65b9\u6cd5 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2CZLO"},"#I2CZLO")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u89c4\u8303\u5316\u6587\u6863\u53ef\u914d\u7f6e\u529f\u80fd\uff0c\u652f\u6301 ",Object(b.b)("inlineCode",{parentName:"li"},"appsettings.json")," \u914d\u7f6e ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2D1K9"},"#I2D1K9")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u8fdc\u7a0b\u8bf7\u6c42\u62e6\u622a\u5668\u6dfb\u52a0\u65b9\u6cd5\u548c\u65b9\u6cd5\u53c2\u6570 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2D2CM"},"#I2D2CM")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u8fdc\u7a0b\u8bf7\u6c42\u51fa\u9519\u8fd4\u56de\u9ed8\u8ba4\u503c\u652f\u6301 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2D44M"},"#I2D44M")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u8fdc\u7a0b\u8bf7\u6c42 ",Object(b.b)("inlineCode",{parentName:"li"},"body")," \u53c2\u6570\u5e8f\u5217\u5316\u652f\u6301\u8bbe\u7f6e ",Object(b.b)("inlineCode",{parentName:"li"},"PropertyNamingPolicy")," ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2D685"},"#I2D685")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u8fdc\u7a0b\u670d\u52a1\u63a5\u53e3\u5ba2\u6237\u7aef\u914d\u7f6e ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2D7PS"},"#I2D7PS")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"AddInject")," \u548c ",Object(b.b)("inlineCode",{parentName:"li"},"UseInject")," \u5141\u8bb8\u81ea\u5b9a\u4e49 ",Object(b.b)("inlineCode",{parentName:"li"},"SecurityDefinitions")," \u548c ",Object(b.b)("inlineCode",{parentName:"li"},"SwaggerUI")," ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2DIMG"},"#I2DIMG")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"[SecurityDefine]")," \u9ed8\u8ba4\u6784\u9020\u51fd\u6570 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2DNXT"},"#I2DNXT")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"AspectDispatchProxy")," \u52a8\u6001\u4ee3\u7406\u7c7b ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2DO6I"},"#I2DO6I")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"[QueryParameters]")," \u7279\u6027\uff0c\u652f\u6301\u4e00\u952e\u5c06 ",Object(b.b)("inlineCode",{parentName:"li"},"Action")," \u53c2\u6570\u6dfb\u52a0 ",Object(b.b)("inlineCode",{parentName:"li"},"[FromQuery]")," \u7279\u6027 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2G8TF"},"#I2G8TF")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u52a8\u6001\u65e5\u5fd7\u914d\u7f6e\u53ca\u62d3\u5c55\u65b9\u6cd5 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2GDGD"},"#I2GDGD")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"WebApi")," \u8bf7\u6c42\u8c13\u8bcd\u9ed8\u8ba4\u89c4\u5219\u914d\u7f6e\u529f\u80fd ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2M70X"},"#I2M70X")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u7a81\u7834\u6027\u53d8\u5316")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u5347\u7ea7]"," ",Object(b.b)("inlineCode",{parentName:"li"},".NET 5")," SDK \u5230 ",Object(b.b)("inlineCode",{parentName:"li"},".NET 5.0.2")," \u7248\u672c ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2D0PZ"},"#I2D0PZ")),Object(b.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," \u6846\u67b6\u5185\u6240\u6709\u62d3\u5c55\u7c7b\u547d\u540d\u7a7a\u95f4\uff0c\u5168\u90e8\u8fc1\u79fb\u5230 ",Object(b.b)("inlineCode",{parentName:"li"},"Furion.\u6a21\u5757.Extensions")," \u4e0b ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2AH54"},"#I2AH54")),Object(b.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Swagger")," \u8bb0\u4f4f\u6388\u6743\u5b58\u50a8\u65b9\u5f0f\uff0c\u66ff\u6362 ",Object(b.b)("inlineCode",{parentName:"li"},"Session")," \u5b58\u50a8\u65b9\u5f0f\u4e3a ",Object(b.b)("inlineCode",{parentName:"li"},"LocalStorage")," \u65b9\u5f0f ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2AKUA"},"#I2AKUA")),Object(b.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Furion")," \u6846\u67b6\u5305\u63cf\u8ff0\u6587\u4ef6\uff0c\u51cf\u5c11\u6846\u67b6\u4f53\u79ef ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2APAU"},"#I2APAU")),Object(b.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," ",Object(b.b)("inlineCode",{parentName:"li"},"App.CanBeScanTypes")," \u4e3a ",Object(b.b)("inlineCode",{parentName:"li"},"App.EffectiveTypes")," ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2B0ZR"},"#I2B0ZR")),Object(b.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," ",Object(b.b)("inlineCode",{parentName:"li"},"App.ServiceProvider")," \u5c5e\u6027\u5e76\u79fb\u9664 ",Object(b.b)("inlineCode",{parentName:"li"},"App.GetDuplicateXXX")," \u65b9\u6cd5 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2CYZE"},"#I2CYZE")),Object(b.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Db.GetDuplicateDbContext")," \u4e3a ",Object(b.b)("inlineCode",{parentName:"li"},"Db.GetNewDbContext")," ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2CZ04"},"#I2CZ04")),Object(b.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Db.GetSqlDispatchProxy")," \u4e3a ",Object(b.b)("inlineCode",{parentName:"li"},"Db.GetSqlProxy")," ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2DO9T"},"#I2DO9T")),Object(b.b)("li",{parentName:"ul"},"[\u91cd\u6784]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Aop")," \u670d\u52a1\u62e6\u622a\u5668\uff0c\u652f\u6301\u5f02\u6b65\u3001\u540c\u6b65\u4e24\u79cd\u65b9\u5f0f ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2B9HQ"},"#I2B9HQ")),Object(b.b)("li",{parentName:"ul"},"[\u91cd\u6784]"," \u7f51\u7edc\u8bf7\u6c42\u6240\u6709\u529f\u80fd ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2BMR7"},"#I2BMR7")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u95ee\u9898\u4fee\u590d")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Swagger")," \u89c4\u8303\u5316\u5316\u7ed3\u679c\u4e0d\u4e00\u81f4 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2ACF3"},"#I2ACF3")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u6570\u636e\u5e93\u65b0\u589e\u6216\u66f4\u65b0\u5ffd\u7565\u7a7a\u503c\u64cd\u4f5c\u65b9\u6cd5\u62a5\u7a7a\u5f02\u5e38 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2AB6C"},"#I2AB6C")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Startup.cs")," Aop \u5168\u5c40\u62e6\u622a\u65e0\u6548 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2A7T2"},"#I2A7T2")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Token")," \u8fc7\u671f\u540e\u81ea\u52a8\u5237\u65b0 ",Object(b.b)("inlineCode",{parentName:"li"},"Token")," \u65e0\u6cd5\u83b7\u53d6\u6700\u65b0\u7684\u7528\u6237\u4fe1\u606f bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2AWQI"},"#I2AWQI")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},'[ApiDescriptionSettings(Tag="xx")]')," \u5bfc\u81f4 ",Object(b.b)("inlineCode",{parentName:"li"},"swagger.json")," \u62a5\u9519 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2B47R"},"#I2B47R")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Mysql")," sql \u6570\u636e\u5e93\u67e5\u8be2\u7ed3\u679c ",Object(b.b)("inlineCode",{parentName:"li"},"tinyint")," \u7c7b\u578b\u8f6c\u6362\u51fa\u9519 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2BEBM"},"#I2BEBM")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u89c4\u8303\u5316\u7ed3\u679c\u591a\u6b21\u5305\u88f9\u7c7b\u578b bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2BHHZ"},"#I2BHHZ")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u52a8\u6001 Api \u57fa\u5143\u7c7b\u578b\u6570\u7ec4\u95ee\u9898 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2BMS5"},"#I2BMS5")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"sql")," \u67e5\u8be2\u679a\u4e3e\u7c7b\u578b\u8f6c\u6362\u5f02\u5e38 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2BS2Y"},"#I2BS2Y")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"string.SqlQuerizeAsync()")," \u62d3\u5c55\u8fd4\u56de\u9519\u8bef bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2BSTS"},"#I2BSTS")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u52a8\u6001 Api \u5b50\u7c7b\u91cd\u5199\u7236\u7c7b\u65b9\u6cd5\u5e76\u53d6\u522b\u540d\u540e ",Object(b.b)("inlineCode",{parentName:"li"},"Swagger")," \u5f02\u5e38 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2C9VP"},"#I2C9VP")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u7f51\u7edc\u8bf7\u6c42 ",Object(b.b)("inlineCode",{parentName:"li"},"application/json")," \u5e8f\u5217\u5316\u5927\u5c0f\u5199\u95ee\u9898 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2CRJC"},"#I2CRJC")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u591a\u6570\u636e\u5e93\u5b9a\u4f4d\u5668\u5b9e\u4f53\u5d4c\u5957\u5173\u8054 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2CVN0"},"#I2CVN0")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u8de8\u57df\u54cd\u5e94\u5934\u8bbe\u7f6e\u65e0\u6548 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2CW5T"},"#I2CW5T")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u8fdc\u7a0b\u7f51\u7edc\u8bf7\u6c42\u4ee3\u7406\u6253\u5370\u5230 ",Object(b.b)("inlineCode",{parentName:"li"},"MiniProfiler")," bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2CZBC"},"#I2CZBC")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u8fdc\u7a0b\u8bf7\u6c42\u54cd\u5e94\u62e6\u622a\u5668 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2D4DG"},"#I2D4DG")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"SqlSugar")," \u6846\u67b6 ",Object(b.b)("inlineCode",{parentName:"li"},"AsQueryable()")," \u4e00\u76f4\u8ffd\u52a0\u53c2\u6570 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2DH1D"},"#I2DH1D")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u81ea\u52a8\u5237\u65b0 ",Object(b.b)("inlineCode",{parentName:"li"},"Token")," \u7a7a\u5f02\u5e38 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2DO29"},"#I2DO29")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u751f\u6210 ",Object(b.b)("inlineCode",{parentName:"li"},"JWT Token")," \u4e0d\u4f20\u8fc7\u671f\u65f6\u95f4\u51fa\u73b0\u9a8c\u8bc1 401 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2DO8L"},"#I2DO8L")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"AppStartup")," \u6392\u5e8f\u65e0\u6548 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2DVD2"},"#I2DVD2")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u672a\u542f\u7528\u591a\u8bed\u8a00\u670d\u52a1\u65f6\u53cb\u597d\u5f02\u5e38\u548c\u9a8c\u8bc1\u51fa\u73b0\u7a7a\u5f02\u5e38 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2ECUJ"},"#I2ECUJ")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u6570\u636e\u6821\u9a8c\u5b57\u6bcd\u548c\u6570\u5b57\u7ec4\u5408\u65e0\u6cd5\u5339\u914d bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2EF2Q"},"#I2EF2Q")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u6570\u636e\u6821\u9a8c\u624b\u673a\u6216\u56fa\u8bdd\u65e0\u6548 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2M5IZ"},"#I2M5IZ")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Dapper")," \u62d3\u5c55\u89e3\u6790 ",Object(b.b)("inlineCode",{parentName:"li"},"SqlConnection")," \u5f02\u5e38 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2M5P2"},"#I2M5P2")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u5f00\u542f\u591a\u8bed\u8a00\u540e\uff0c",Object(b.b)("inlineCode",{parentName:"li"},"EF")," \u8fc1\u79fb\u5f02\u5e38 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2M7DT"},"#I2M7DT")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"IEntityTypeBuilder")," \u4e0d\u652f\u6301\u591a\u91cd\u7ee7\u627f bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2PAOD"},"#I2PAOD")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"JwtHandler")," \u8bbe\u7f6e\u81ea\u52a8\u5237\u65b0\u540e\uff0c\u533f\u540d\u8bbf\u95ee\u65e0\u6cd5\u901a\u8fc7 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2SDOX"},"#I2SDOX")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Dapper")," \u62d3\u5c55\u4e2d ",Object(b.b)("inlineCode",{parentName:"li"},"SqlServer")," \u6570\u636e\u5e93\u83b7\u53d6\u8fde\u63a5\u5bf9\u8c61\u7c7b\u578b bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/pulls/159"},"#PR159")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u5176\u4ed6\u66f4\u6539")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u4f18\u5316]"," \u79fb\u9664 ",Object(b.b)("inlineCode",{parentName:"li"},"Sql")," \u67e5\u8be2\u7ed3\u679c\u6620\u5c04\u68c0\u67e5 ",Object(b.b)("inlineCode",{parentName:"li"},"[NotMapper]")," \u7279\u6027\u673a\u5236 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I34XD0"},"#I34XD0")),Object(b.b)("li",{parentName:"ul"},"[\u4f18\u5316]"," \u4f9d\u8d56\u6ce8\u5165\u65f6\u6392\u9664 ",Object(b.b)("inlineCode",{parentName:"li"},"IDynamicApiController")," \u63a5\u53e3 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2ECTG"},"#I2ECTG")),Object(b.b)("li",{parentName:"ul"},"[\u4f18\u5316]"," ",Object(b.b)("inlineCode",{parentName:"li"},"MD5")," \u52a0\u5bc6\u6027\u80fd ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/pulls/158"},"#PR158")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u6587\u6863\u53d8\u5316")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u91cd\u6784]"," \u6587\u6863\u9996\u9875 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I34XBR"},"#I34XBR")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u7f51\u7edc\u8bf7\u6c42\u6587\u6863 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2APGJ"},"#I2APGJ")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u591a\u8bed\u8a00\u6587\u6863 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2DOCL"},"#I2DOCL")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u6587\u6863\u5168\u6587\u641c\u7d22\u5f15\u64ce ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I34XAW"},"#I34XAW")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u5168\u5c40\u9759\u6001\u7c7b\u7c7b\u578b ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I34XB4"},"#I34XB4")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u6846\u67b6\u53ef\u914d\u7f6e\u9009\u9879\u6587\u6863 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I34XB9"},"#I34XB9")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u4e8b\u4ef6\u603b\u7ebf\u6587\u6863 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I34XBI"},"#I34XBI")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u6570\u636e\u52a0\u89e3\u5bc6\u6587\u6863 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I34XC0"},"#I34XC0")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u8d21\u732e\u6307\u5357\u6587\u6863 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I34XC8"},"#I34XC8")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"HttpContext")," \u53ca ",Object(b.b)("inlineCode",{parentName:"li"},"\u6587\u4ef6\u4e0a\u4f20\u4e0b\u8f7d")," \u535a\u5ba2\u6587\u7ae0 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I34XCB"},"#I34XCB")),Object(b.b)("li",{parentName:"ul"},"[\u5176\u4ed6]"," \u6587\u6863\u5c0f\u8c03\u6574\uff0c\u5c0f\u4f18\u5316"))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u95ee\u7b54\u7b54\u7591")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u8de8\u57df\u8bbe\u7f6e\u65e0\u6548 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2ASNJ"},"#I2ASNJ")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(b.b)("inlineCode",{parentName:"li"},"MVC")," \u89c6\u56fe\u65e0\u6548\uff0c\u539f\u56e0\u662f ",Object(b.b)("inlineCode",{parentName:"li"},".cshtml")," \u6587\u4ef6\u6ca1\u6709\u8bbe\u7f6e\u4e3a ",Object(b.b)("inlineCode",{parentName:"li"},"\u5185\u5bb9")," ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2AXUU"},"#I2AXUU")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Sql")," \u64cd\u4f5c\u53ef\u4ee5\u5b9e\u73b0\u4e8b\u52a1\u5417\uff1f",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2B0NX"},"#I2B0NX")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(b.b)("inlineCode",{parentName:"li"},"IRepository")," \u64cd\u4f5c\u6570\u636e\u5e93\u4f1a\u6253\u5f00\u591a\u6b21\u6570\u636e\u5e93\u8fde\u63a5 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2BB7B"},"#I2BB7B")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u5982\u4f55\u8fdb\u5165\u81ea\u5b9a\u4e49 ",Object(b.b)("inlineCode",{parentName:"li"},"AppAuthorizeHandler")," \u65ad\u70b9 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2BGXY"},"#I2BGXY")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(b.b)("inlineCode",{parentName:"li"},"SqlSugar")," \u6ce8\u5165\u95ee\u9898 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2C2AQ"},"#I2C2AQ")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u5efa\u8bae\u589e\u52a0 API \u7b7e\u540d\u9a8c\u8bc1\uff0c\u65f6\u6548\u9a8c\u8bc1 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2C6ET"},"#I2C6ET")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u591a\u6570\u636e\u5e93\u591a\u79df\u6237\u540c\u65f6\u4f7f\u7528 ",Object(b.b)("inlineCode",{parentName:"li"},"Add-Migration")," \u62a5\u9519 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2CEHS"},"#I2CEHS")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(b.b)("inlineCode",{parentName:"li"},"ISqlSugarRepository")," \u6ca1\u6709 ",Object(b.b)("inlineCode",{parentName:"li"},"Getxxx")," \u65b9\u6cd5 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2CJLZ"},"#I2CJLZ")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(b.b)("inlineCode",{parentName:"li"},"cli.ps1")," \u5982\u4f55\u5c06 ",Object(b.b)("inlineCode",{parentName:"li"},"sql")," \u91cc\u7684\u8868\u5bfc\u51fa\u6210 ",Object(b.b)("inlineCode",{parentName:"li"},"model")," \u7c7b ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2CSUL"},"#I2CSUL")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u624b\u52a8\u4fee\u6539 ",Object(b.b)("inlineCode",{parentName:"li"},"Swagger")," \u7ec8\u7ed3\u70b9\u8def\u5f84\u65e0\u6548 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2D608"},"#I2D608")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(b.b)("inlineCode",{parentName:"li"},"DefaultDbContext")," \u4e0d\u80fd\u8bc6\u522b ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2DCZX"},"#I2DCZX")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u5404\u5206\u5c42\u9879\u76ee ",Object(b.b)("inlineCode",{parentName:"li"},"Startup.cs")," \u652f\u6301 ",Object(b.b)("inlineCode",{parentName:"li"},"Configuration")," ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2DDUP"},"#I2DDUP")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Aop")," \u65e0\u6cd5\u62e6\u622a\uff0c\u65e0\u6548 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2DEY8"},"#I2DEY8")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(b.b)("inlineCode",{parentName:"li"},"mysql")," \u6267\u884c ",Object(b.b)("inlineCode",{parentName:"li"},"Add-Migration")," \u62a5\u9519 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2DSB8"},"#I2DSB8"),"\\"),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Entity")," \u521b\u5efa\u65f6\u95f4\u548c\u662f\u5426\u5220\u9664\u6dfb\u52a0\u9ed8\u8ba4\u503c ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2E04H"},"#I2E04H")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(b.b)("inlineCode",{parentName:"li"},"swagger")," \u4e2d\u591a\u4e2a ",Object(b.b)("inlineCode",{parentName:"li"},"servers")," \u8bbe\u7f6e ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2E0IF"},"#I2E0IF")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u5168\u5c40\u7b5b\u9009\u5668 \u6ca1\u6709\u6267\u884c ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2E5R4"},"#I2E5R4")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u591a\u6570\u636e\u5e93\u5b9a\u4f4d\u5668\u7591\u95ee ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2E77T"},"#I2E77T")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(b.b)("inlineCode",{parentName:"li"},"cli.ps")," \u9006\u5411\u5de5\u7a0b ",Object(b.b)("inlineCode",{parentName:"li"},"Mysql")," \u6570\u636e\u5e93\u62a5\u9519 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2E7I5"},"#I2E7I5")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Swagger")," \u5f00\u53d1\u73af\u5883 ",Object(b.b)("inlineCode",{parentName:"li"},"applicationsettings.json")," \u4e2d\u6587\u4e71\u7801 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2EAG1"},"#I2EAG1")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u589e\u52a0\u6307\u5b9a\u8def\u5f84\u7a0b\u5e8f\u96c6\u6620\u5c04 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2EEO2"},"#I2EEO2")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u52a8\u6001\u7f16\u8bd1 ",Object(b.b)("inlineCode",{parentName:"li"},"cs")," \u811a\u672c\u6587\u4ef6 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2EH66"},"#I2EH66")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u81ea\u5b9a\u4e49\u4e2d\u95f4\u4ef6\uff0c\u8fd4\u56de\u7684\u9519\u8bef\u6ca1\u6709\u89c4\u8303\u5316\u7ed3\u679c ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2NV8S"},"#I2NV8S")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Swagger")," \u5faa\u73af\u5f15\u7528\u8bbe\u7f6e\u751f\u6210\u6587\u6863\u5c42\u7ea7\u65e0\u6548 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2PLQQ"},"#I2PLQQ")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u914d\u7f6e\u6587\u4ef6\u652f\u6301 ",Object(b.b)("inlineCode",{parentName:"li"},"yaml")," \u6587\u4ef6\u5417? ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2TJ3N"},"#I2TJ3N")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u4fee\u6539\u6570\u636e\u5e93\u672a ",Object(b.b)("inlineCode",{parentName:"li"},"mysql")," \u6267\u884c ",Object(b.b)("inlineCode",{parentName:"li"},"Add-Migration")," \u62a5\u9519 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2VR64"},"#I2VR64")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u591a\u6570\u636e\u5e93\u4f7f\u7528\u5b9a\u4f4d\u5668\u65f6\u62a5\u9519 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2VR8F"},"#I2VR8F")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Migration To Oracle")," \u5f02\u5e38 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2WBYQ"},"#I2WBYQ")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u5f00\u53d1\u65f6\u663e\u793a ",Object(b.b)("inlineCode",{parentName:"li"},"Swagger"),"\uff0c\u4e0a\u7ebf\u65f6\u5173\u95ed ",Object(b.b)("inlineCode",{parentName:"li"},"Swagger"),"\uff0c\u8fd9\u9700\u8981\u600e\u4e48\u914d\u7f6e ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2WOYV"},"#I2WOYV")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u517c\u5bb9 Mvc \u590d\u6742\u9a8c\u8bc1\u6ca1\u6709\u8bd5\u9a8c\u6210\u529f ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2X3GV"},"#I2X3GV")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Aop")," \u80fd\u4e0d\u80fd\u652f\u6301\u65e0\u63a5\u53e3\u7684\u7c7b ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2X8AS"},"#I2X8AS")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u5173\u4e8e ",Object(b.b)("inlineCode",{parentName:"li"},"JWT Token")," \u81ea\u52a8\u5237\u65b0\u95ee\u9898 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2YD4K"},"#I2YD4K")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u80fd\u5426\u589e\u52a0\u4e00\u4e2a\u62d3\u5c55\u7684 ",Object(b.b)("inlineCode",{parentName:"li"},"Entity"),"\uff0c\u589e\u52a0\u4e00\u4e9b\u62d3\u5c55\u7684\u5c5e\u6027 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2YDKT"},"#I2YDKT")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Furion")," \u65e0\u6cd5\u8fd8\u539f\u5305\uff0c\u4f7f\u7528",Object(b.b)("inlineCode",{parentName:"li"},"Nuget")," \u4e0b\u8f7d\u548c\u901a\u8fc7\u6700\u65b0\u7684\u7684\u811a\u624b\u67b6\u4e0b\u8f7d\u90fd\u63d0\u793a\u8fd9\u4e2a\u95ee\u9898 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I30446"},"#I30446")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u590d\u6742\u6821\u9a8c\u4e0e\u7279\u6027\u9a8c\u8bc1\u4e0d\u80fd\u5e76\u884c ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I3046U"},"#I3046U")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u4e0d\u505a\u5b9e\u73b0")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u5f15\u5165 Webhook \u673a\u5236 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2A3I0"},"#I2A3I0")),Object(b.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u589e\u52a0 blog \u5b58\u50a8\u670d\u52a1 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2AMBP"},"#I2AMBP")),Object(b.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," Blazor Server \u73af\u5883\u4e0b EF \u7684 DbContext \u591a\u7ebf\u7a0b\u95ee\u9898 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2AMD2"},"#I2AMD2")),Object(b.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u5e0c\u671b\u5b9e\u73b0\u5de5\u4f5c\u5355\u5143\u64cd\u4f5c\u63a5\u53e3\uff08IUnitOfWork\uff09",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2AOR5"},"#I2AOR5")),Object(b.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u5efa\u8bae\u65b0\u589e ",Object(b.b)("inlineCode",{parentName:"li"},"string.ToPagedListAsync()")," \u64cd\u4f5c ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2BZ3Z"},"#I2BZ3Z")),Object(b.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u5efa\u8bae\u65b0\u589e ",Object(b.b)("inlineCode",{parentName:"li"},"GraphQL"),"\uff0c",Object(b.b)("inlineCode",{parentName:"li"},"OData")," \u529f\u80fd ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2C9EH"},"#I2C9EH")),Object(b.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u8feb\u5207\u671f\u671b\u652f\u6301 CAP \u5206\u5e03\u5f0f\u4e8b\u52a1 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2CBRF"},"#I2CBRF")),Object(b.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u5982\u4f55\u8ba9\u67d0\u4e2a\u65b9\u6cd5\u6216\u5b9e\u4f53\u53d8\u5316\u540e\uff0c\u4e0d\u88ab ",Object(b.b)("inlineCode",{parentName:"li"},"SavingChangesEvent")," \u7b49\u62e6\u622a ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2CEM9"},"#I2CEM9")),Object(b.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u5efa\u8bae\u65e5\u5fd7\u5c01\u88c5\u589e\u52a0\u66f4\u591a\u62d3\u5c55\uff0c\u6bd4\u5982\uff1a\u81ea\u5b9a\u4e49\u4fdd\u5b58\u65e5\u5fd7\u6587\u4ef6 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2CW8V"},"#I2CW8V")),Object(b.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u5bf9 ",Object(b.b)("inlineCode",{parentName:"li"},"SqlSugar")," \u7684\u652f\u6301\uff0c\u589e\u52a0 ",Object(b.b)("inlineCode",{parentName:"li"},"Nuget")," \u811a\u624b\u67b6 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2D91U"},"#I2D91U")),Object(b.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u4f7f\u7528 ",Object(b.b)("inlineCode",{parentName:"li"},"Middleware")," \u5b9e\u73b0\u53cd\u5411\u4ee3\u7406 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2DKM1"},"#I2DKM1")),Object(b.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u652f\u6301\u914d\u7f6e\u591a\u4e2a ",Object(b.b)("inlineCode",{parentName:"li"},"Aop")," \u529f\u80fd ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2E6Z2"},"#I2E6Z2")),Object(b.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u662f\u5426\u8ba1\u5212\u5f00\u53d1\u7c7b\u4f3c\u7f51\u5173\u7684\u529f\u80fd ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2PD1L"},"#I2PD1L")),Object(b.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," ",Object(b.b)("inlineCode",{parentName:"li"},"waring CS8002"),": \u5f15\u7528\u7a0b\u5e8f\u96c6 ",Object(b.b)("inlineCode",{parentName:"li"},"Furion")," \u6ca1\u6709\u5f3a\u540d\u79f0 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2WDN2"},"#I2WDN2")),Object(b.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," Oracle \u6570\u636e\u5e93\u9a71\u52a8\u96c6\u6210 ",Object(b.b)("inlineCode",{parentName:"li"},"Devart.Data.Oracle.Entity.EFCore")," ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2XJIU"},"#I2XJIU"))))),Object(b.b)("hr",null),Object(b.b)("h2",{id:"v170\uff08\u5df2\u53d1\u5e03\uff09"},"v1.7.0\uff08\u5df2\u53d1\u5e03\uff09"),Object(b.b)("ul",null,Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u65b0\u7279\u6027")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Furion.Extras.ObjectMapper.Mapster")," \u62d3\u5c55\u5305 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29LSJ"},"#I29LSJ")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Furion.Extras.Logging.Serilog")," \u62d3\u5c55\u5305 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2AAN8"},"#I2AAN8")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Furion.Extras.Web.HttpContext")," \u62d3\u5c55\u5305 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29LSM"},"#I29LSM")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u5185\u7f6e ",Object(b.b)("inlineCode",{parentName:"li"},"Token")," \u5237\u65b0\u673a\u5236\u652f\u6301 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29K57"},"#I29K57")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u52a8\u6001\u6570\u636e\u5e93\u4e0a\u4e0b\u6587\uff0c\u652f\u6301\u8fd0\u884c\u65f6\u6267\u884c ",Object(b.b)("inlineCode",{parentName:"li"},"OnModelCreating")," ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I28UDT"},"#I28UDT")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u652f\u6301\u4f9d\u8d56\u6ce8\u5165\u6392\u9664\u6307\u5b9a\u63a5\u53e3 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29693"},"#I29693")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u89c4\u8303\u5316\u7ed3\u679c\u8fd4\u56de\u65f6\u95f4\u6233\u5b57\u6bb5 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29697"},"#I29697")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u57fa\u7840 ",Object(b.b)("inlineCode",{parentName:"li"},"CURD")," \u7236\u7c7b\u64cd\u4f5c\u4f8b\u5b50 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I296SR"},"#I296SR")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},'sql.Change("\u5b9a\u4f4d\u5668\u5b8c\u6574\u7c7b\u578b\u540d\u79f0")')," \u652f\u6301 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29LAB"},"#I29LAB")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"UpdateInclude")," \u548c ",Object(b.b)("inlineCode",{parentName:"li"},"UpdateExclude")," \u5ffd\u7565\u7a7a\u53c2\u6570\u652f\u6301 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29VUG"},"#I29VUG")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u6570\u636e\u5e93\u4e0a\u4e0b\u6587\u5185\u7f6e\u5047\u5220\u9664\u67e5\u8be2\u8fc7\u6ee4\u5668\u652f\u6301 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29Y2R"},"#I29Y2R")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u5ffd\u7565\u7a7a\u503c\u6392\u9664\u9ed8\u8ba4\u65f6\u95f4\u683c\u5f0f ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29VUV"},"#I29VUV")),Object(b.b)("li",{parentName:"ul"},"[\u5347\u7ea7]"," ",Object(b.b)("inlineCode",{parentName:"li"},"MiniProfiler")," \u7ec4\u4ef6 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I297R9"},"#I297R9")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u7a81\u7834\u6027\u53d8\u5316")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," ",Object(b.b)("inlineCode",{parentName:"li"},"AppAuthorizeHandler")," \u6388\u6743\u7ba1\u9053\u4e3a\u5f02\u6b65\u5904\u7406 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29MD9"},"#I29MD9")),Object(b.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Swagger")," \u9ed8\u8ba4\u542f\u7528 ",Object(b.b)("inlineCode",{parentName:"li"},"JWT")," \u6388\u6743\u652f\u6301 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29LI4"},"#I29LI4")),Object(b.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," ",Object(b.b)("inlineCode",{parentName:"li"},"HttpContextUtilities")," \u540d\u79f0\u6539\u4e3a ",Object(b.b)("inlineCode",{parentName:"li"},"HttpContextLocal")," ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29KQE"},"#I29KQE")),Object(b.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," ",Object(b.b)("inlineCode",{parentName:"li"},"UnifyResultContext")," \u540d\u79f0\u6539\u4e3a ",Object(b.b)("inlineCode",{parentName:"li"},"UnifyContext")," ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29LLZ"},"#I29LLZ")),Object(b.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," \u53ea\u6709\u6267\u884c\u8fc1\u79fb\u547d\u4ee4\u624d\u626b\u63cf\u79cd\u5b50\u6570\u636e ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29E6P"},"#I29E6P")),Object(b.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," \u89c4\u8303\u5316\u7ed3\u679c ",Object(b.b)("inlineCode",{parentName:"li"},"Successed")," \u5c5e\u6027\u540d\u4e3a ",Object(b.b)("inlineCode",{parentName:"li"},"Succeeded")," ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29NMV"},"#I29NMV")),Object(b.b)("li",{parentName:"ul"},"[\u79fb\u9664]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Mapster")," \u5bf9\u8c61\u7ec4\u4ef6\uff0c\u91c7\u7528\u63d0\u4f9b\u62d3\u5c55\u65b9\u5f0f ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29D2M"},"#I29D2M")),Object(b.b)("li",{parentName:"ul"},"[\u79fb\u9664]"," ",Object(b.b)("inlineCode",{parentName:"li"},"CacheManager")," \u62d3\u5c55\u7c7b ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29LU1"},"#I29LU1")),Object(b.b)("li",{parentName:"ul"},"[\u91cd\u6784]"," ",Object(b.b)("inlineCode",{parentName:"li"},"SaveChanges")," \u62e6\u622a\u5668 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I292LO"},"#I292LO")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u95ee\u9898\u4fee\u590d")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u672a\u6ce8\u518c\u7684\u6570\u636e\u5e93\u4e0a\u4e0b\u6587\u4e5f\u88ab\u5f15\u7528\u5168\u5c40\u67e5\u8be2\u62e6\u622a\u5668 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29ZXJ"},"#I29ZXJ")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u624b\u52a8\u8fd4\u56de ",Object(b.b)("inlineCode",{parentName:"li"},"BadObjectResult")," \u6216 ",Object(b.b)("inlineCode",{parentName:"li"},"ValidationProblemDetails")," \u7ed3\u679c\u7c7b\u578b\u65f6\u89c4\u8303\u5316\u7ed3\u679c\u5931\u6548 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29ZU9"},"#I29ZU9")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u52a8\u6001 WebApi ",Object(b.b)("inlineCode",{parentName:"li"},"KeepName"),"\uff0c",Object(b.b)("inlineCode",{parentName:"li"},"KeepVerb"),"\u3001",Object(b.b)("inlineCode",{parentName:"li"},"SplitCamelCase")," \u65e0\u6548 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29X90"},"#I29X90")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Sql\u4ee3\u7406")," \u8fd4\u56de ",Object(b.b)("inlineCode",{parentName:"li"},"\u5143\u7ec4")," \u7c7b\u578b\u51fa\u9519 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29SMV"},"#I29SMV")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"401\uff0c403")," \u72b6\u6001\u7801\u89c4\u8303\u5316\u8fd4\u56de\u503c\u5c5e\u6027\u53d8\u5927\u5199 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29M8Y"},"#I29M8Y")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"HttpContext")," \u7a7a\u5f02\u5e38 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29LU4"},"#I29LU4")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u63a5\u53e3\u65e0\u8fd4\u56de\u503c\u6ca1\u6709\u5e94\u7528\u89c4\u8303\u5316\u7ed3\u679c bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29GT7"},"#I29GT7")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u524d\u7aef ",Object(b.b)("inlineCode",{parentName:"li"},"Less")," \u914d\u7f6e\u6587\u4ef6\u5bfc\u81f4\u4e3b\u673a\u542f\u52a8\u5931\u8d25 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29E7P"},"#I29E7P")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u6267\u884c ",Object(b.b)("inlineCode",{parentName:"li"},"sql")," \u7ed3\u679c\u8f6c\u6cdb\u578b\u540e\u5c5e\u6027\u91cd\u590d\u8d4b\u503c bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29BUO"},"#I29BUO")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Swagger")," \u5173\u95ed ",Object(b.b)("inlineCode",{parentName:"li"},"MiniProfiler")," \u4e4b\u540e ",Object(b.b)("inlineCode",{parentName:"li"},"\u7ec4\u4e2d\u7ec4")," \u5931\u6548 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29789"},"#I29789")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u672a\u542f\u7528\u89c4\u8303\u5316\u7ed3\u679c\u65f6\u5f02\u5e38\u8fd4\u56de ",Object(b.b)("inlineCode",{parentName:"li"},"System.Object")," \u5b57\u7b26 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2969A"},"#I2969A")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u6b63\u6570\u6570\u636e\u9a8c\u8bc1 0 \u4e5f\u9a8c\u8bc1\u901a\u8fc7 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2955T"},"#I2955T")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u975e\u6cdb\u578b\u7c7b\u96c6\u6210\u6cdb\u578b\u63a5\u53e3\u4f9d\u8d56\u6ce8\u5165 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I294YT"},"#I294YT")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Swagger")," \u4e0d\u652f\u6301 ",Object(b.b)("inlineCode",{parentName:"li"},"new")," \u8986\u76d6\u7236\u7c7b\u7684 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I28Z1A"},"#I28Z1A")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"JsonSerializerUtility")," \u6ca1\u6709\u516c\u5f00 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I28WMI"},"#I28WMI")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"SqlSugar")," \u62d3\u5c55\u67e5\u8be2\u6cdb\u578b\u7c7b\u578b\u6ce8\u518c\u5f02\u5e38 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I28VMT"},"#I28VMT")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Furion Tools")," \u4e0d\u652f\u6301\u751f\u6210\u4e0d\u540c\u547d\u540d\u7a7a\u95f4\u7684\u5b9e\u4f53 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2A175"},"#I2A175")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u5168\u5c40\u62e6\u622a\u5668\u65e0\u6548 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2A7T2"},"#I2A7T2")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u65b0\u589e\u6216\u66f4\u65b0\u5ffd\u7565\u7a7a\u503c\u7a7a\u5f02\u5e38 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2AB6C"},"#I2AB6C")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u5176\u4ed6\u66f4\u6539")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u4f18\u5316]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Token")," \u751f\u6210\u52a0\u5bc6\u7b97\u6cd5 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29KIH"},"#I29KIH")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u6587\u6863\u53d8\u5316")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u65e5\u5fd7\u6587\u6863 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I28Y9D"},"#I28Y9D")),Object(b.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," \u6570\u636e\u5e93\u4e0a\u4e0b\u6587\u3001\u5b9e\u4f53\u62e6\u622a\u5668\u3001\u914d\u7f6e\u3001\u4e00\u5206\u949f\u5165\u95e8\u7b49\u7b49\u6587\u6863"))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u95ee\u7b54\u7b54\u7591")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u95ee\u7b54]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Swagger")," \u5982\u4f55\u5b9e\u73b0\u6388\u6743\u8bbf\u95ee ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I294F2"},"#I294F2")),Object(b.b)("li",{parentName:"ul"},"[\u95ee\u7b54]"," \u5982\u4f55\u5b9e\u73b0\u591a\u4e2a\u6570\u636e\u5e93\u591a\u5bf9\u591a\u5b9e\u4f53\u914d\u7f6e ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29G6S"},"#I29G6S")),Object(b.b)("li",{parentName:"ul"},"[\u95ee\u7b54]"," \u52a8\u6001 WebApi \u652f\u6301\u6587\u4ef6\u4e0a\u4f20\u5417 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29R5E"},"#I29R5E")),Object(b.b)("li",{parentName:"ul"},"[\u7591\u95ee]"," \u591a\u4e2a\u6570\u636e\u5e93\u4e0a\u4e0b\u6587\u65e0\u6cd5\u751f\u6210\u8fc1\u79fb\u4ee3\u7801 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2A6II"},"#I2A6II")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u4e0d\u505a\u5b9e\u73b0")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u5b9e\u73b0 ",Object(b.b)("inlineCode",{parentName:"li"},"BuildChange")," \u4f20\u5165\u8868\u540d ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I292SN"},"#I292SN")),Object(b.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u6267\u884c\u6570\u636e\u5e93\u64cd\u4f5c\u7ed3\u679c\u4e0d\u652f\u6301\u5c5e\u6027\u5ffd\u7565\u5927\u5c0f\u5199\u8d4b\u503c ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29DRQ"},"#I29DRQ")),Object(b.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u5f15\u5165 ",Object(b.b)("inlineCode",{parentName:"li"},"Webhook")," \u673a\u5236 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2A3I0"},"#I2A3I0"))))),Object(b.b)("hr",null),Object(b.b)("h2",{id:"v140\uff08\u5df2\u53d1\u5e03\uff09"},"v1.4.0\uff08\u5df2\u53d1\u5e03\uff09"),Object(b.b)("ul",null,Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u65b0\u7279\u6027")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Furion")," \u652f\u6301\u4e8c\u7ea7\u865a\u62df\u76ee\u5f55\u90e8\u7f72\u529f\u80fd ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I28B77"},"#I28B77")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Furion.Template.RazorWithWebApi")," \u811a\u624b\u67b6 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I28QGI"},"#I28QGI")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Furion.Template.BlazorWithWebApi")," \u811a\u624b\u67b6 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I27Z3O"},"#I27Z3O")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"EFCore")," \u65f6\u6001\u67e5\u8be2\u62d3\u5c55 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I28AJ6"},"#I28AJ")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"[AppDbContext(\u8fde\u63a5\u5b57\u7b26\u4e32\uff0c\u6570\u636e\u5e93\u7c7b\u578b)]")," \u914d\u7f6e\u652f\u6301 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I28QTB"},"#I28QTB")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"DateTimeOffset")," \u8f6c ",Object(b.b)("inlineCode",{parentName:"li"},"DateTime")," \u62d3\u5c55\u65b9\u6cd5 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I27MQA"},"#I27MQA")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"ValidationTypes")," \u9a8c\u8bc1\u6b63\u5219\u8868\u8fbe\u5f0f\u667a\u80fd\u63d0\u793a ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2801V"},"#I2801V")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"ValiationTypes.WordWithNumber")," \u9a8c\u8bc1 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2805A"},"#I2805")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u83b7\u53d6\u5ba2\u6237\u7aef\u548c\u670d\u52a1\u7aef IP \u5730\u5740 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I28QV9"},"#I28QV9")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u7a81\u7834\u6027\u53d8\u5316")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u5347\u7ea7]"," .NET 5.0 \u7248\u672c\u81f3 .NET 5.0.1 \u7248\u672c ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I28QU1"},"#I28QU")),Object(b.b)("li",{parentName:"ul"},"[\u91cd\u6784]"," \u89c6\u56fe\u5f15\u64ce\u529f\u80fd\uff0c\u4f18\u5316\u4e0d\u89c4\u8303\u547d\u540d\u548c\u65b0\u589e\u5b57\u7b26\u4e32\u6a21\u677f\u7f16\u8bd1 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I28G0S"},"#I28G0S")),Object(b.b)("li",{parentName:"ul"},"[\u91cd\u6784]"," \u6570\u636e\u5e93\u5b9e\u4f53\u67e5\u627e\u7b97\u6cd5\uff0c\u5e76\u4f18\u5316\u6027\u80fd ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I28QUQ"},"#I28QUQ")),Object(b.b)("li",{parentName:"ul"},"[\u4f18\u5316]"," \u5e94\u7528\u542f\u52a8\u521d\u59cb\u5316\u6027\u80fd\u548c\u6570\u636e\u5e93\u7b2c\u4e00\u6b21\u81ea\u52a8\u914d\u7f6e ",Object(b.b)("inlineCode",{parentName:"li"},"DbSet")," \u6027\u80fd"))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u95ee\u9898\u4fee\u590d")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u591a\u6570\u636e\u5e93\u4e0a\u4e0b\u6587\u914d\u7f6e\u5b9a\u4f4d\u5668\u540e\u5b9e\u4f53\u65e0\u6cd5\u6b63\u786e\u751f\u6210 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2888L"},"#I2888L")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u591a\u79df\u6237\u6570\u636e\u5e93\u4e0a\u4e0b\u6587\u5b9e\u4f53\u751f\u6210 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2891G"},"#I2891G")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u5bf9\u8c61\u9a8c\u8bc1\u5931\u8d25\u63d0\u793a\u6d88\u606f\u6ca1\u6709\u5e94\u7528 ",Object(b.b)("inlineCode",{parentName:"li"},"JSON")," \u5927\u5c0f\u5199\u914d\u7f6e bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I27UTX"},"#I27UTX")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u4ed3\u50a8 ",Object(b.b)("inlineCode",{parentName:"li"},"Insert")," \u6216 ",Object(b.b)("inlineCode",{parentName:"li"},"Update")," \u65b9\u6cd5\u6307\u5b9a ",Object(b.b)("inlineCode",{parentName:"li"},"ignoreNullValues")," \u65e0\u6548 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I27UN6"},"#I27UN6")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Controller")," \u6d3e\u751f\u7c7b\u5982\u679c\u8d34\u4e86 ",Object(b.b)("inlineCode",{parentName:"li"},"[Route]")," \u7279\u6027\u540e\u51fa\u73b0\u5728 ",Object(b.b)("inlineCode",{parentName:"li"},"Swagger")," \u4e2d bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I27TN7"},"#I27TN7")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"SqlScalar")," \u6267\u884c ",Object(b.b)("inlineCode",{parentName:"li"},"sql")," \u8fd4\u56de ",Object(b.b)("inlineCode",{parentName:"li"},"Nullable")," \u7c7b\u578b\u51fa\u73b0\u8f6c\u6362\u5931\u8d25 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I27S2N"},"#I27S2N")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"[UnitOfWork]")," \u7279\u6027\u5f02\u5e38 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I27MLM"},"#I27MLM")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"sql")," \u9759\u6001\u6267\u884c\u65b9\u5f0f\u548c ",Object(b.b)("inlineCode",{parentName:"li"},"sql")," \u9ad8\u7ea7\u4ee3\u7406\u65e0\u6cd5\u76d1\u542c\u6570\u636e\u5e93\u8fde\u63a5\u72b6\u6001 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I27M4F"},"#I27M4F")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u4fee\u590d\u66f4\u6362 Json \u5e8f\u5217\u5316\u5e93\u65e0\u6548 bug\uff0c\u5982\u66ff\u6362\u4e3a ",Object(b.b)("inlineCode",{parentName:"li"},"Microsoft.AspNetCore.Mvc.NewtonsoftJson")," ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I27M43"},"#I27M43")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Furion Tools")," \u5de5\u5177\u751f\u6210\u6a21\u578b bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I27XI5"},"#I27XI5")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u8f6f\u5220\u9664\u6ca1\u6709\u751f\u6548 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2804I"},"#I2804I")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Furion Tools")," \u8bc6\u522b\u5e26\u591a\u4e2a ",Object(b.b)("inlineCode",{parentName:"li"},"\\\\")," \u7684\u8fde\u63a5\u5b57\u7b26\u4e32\u8bc6\u522b bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I280TS"},"#I280TS"),"\uff0c",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/pulls/91"},"#PR91")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Furion Tools")," \u65e0\u6cd5\u53d6\u6d88\u751f\u6210 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2816M"},"#I2816M")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"DateTimeOffset")," \u8f6c\u672c\u5730\u65f6\u95f4\u5dee 8 \u5c0f\u65f6 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I28BA9"},"#I28BA9")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u542f\u7528 ",Object(b.b)("inlineCode",{parentName:"li"},"bundle js&css")," \u538b\u7f29\u540e\u542f\u52a8\u5f02\u5e38 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I28KRP"},"#I28KR")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"ValidationTypes.Required")," \u65e0\u6548 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/pulls/98"},"#PR98")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u89c4\u8303\u5316\u7ed3\u679c",Object(b.b)("inlineCode",{parentName:"li"},"OnValidateFailed")," \u53c2\u6570\u540d\u62fc\u5199\u9519\u8bef bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/pulls/93"},"#PR93"),"\uff0c",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/pulls/92"},"#PR92")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u6388\u6743\u7ba1\u9053\u9a8c\u8bc1\u5931\u8d25\u8fd8\u663e\u793a\u7ed3\u679c bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/pulls/89"},"#PR89")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u5176\u4ed6\u66f4\u6539")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u66f4\u65b0]"," README.md \u53cb\u60c5\u8fde\u63a5\u5730\u5740 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/pulls/88"},"#PR88")),Object(b.b)("li",{parentName:"ul"},"[\u66f4\u65b0]"," \u6a21\u677f\u811a\u624b\u67b6\u6e90\u7801\uff0c\u6dfb\u52a0 ",Object(b.b)("inlineCode",{parentName:"li"},"EFCore Tools")," \u5e93 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/pulls/87"},"#PR87")),Object(b.b)("li",{parentName:"ul"},"[\u66f4\u65b0]"," README.md Nuget \u56fe\u6807 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/pulls/85"},"#PR85")),Object(b.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u5c06 ",Object(b.b)("inlineCode",{parentName:"li"},"List")," \u8f6c ",Object(b.b)("inlineCode",{parentName:"li"},"DateTable")," ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/pulls/97"},"#PR97")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u6587\u6863\u53d8\u5316")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u89c6\u56fe\u5f15\u64ce\u6a21\u677f\u6587\u6863 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I27ZVA"},"#I27ZVA")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"EFCore")," \u65f6\u6001\u67e5\u8be2\u6587\u6863 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I28AJ6"},"#I28AJ"),", ",Object(b.b)("a",{parentName:"li",href:"https://dotnetchina.gitee.io/furion/docs/dbcontext-hight-query/#91111-%E6%97%B6%E6%80%81%E6%9F%A5%E8%AF%A2"},"DOC")),Object(b.b)("li",{parentName:"ul"},"[\u66f4\u65b0]"," \u4ed3\u50a8\u6587\u6863\u4e66\u5199\u7eb0\u6f0f bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/pulls/90"},"#PR90")),Object(b.b)("li",{parentName:"ul"},"[\u66f4\u65b0]"," \u9009\u9879\u6587\u6863\u9519\u8bef bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/pulls/86"},"#PR86")),Object(b.b)("li",{parentName:"ul"},"[\u66f4\u65b0]"," ",Object(b.b)("inlineCode",{parentName:"li"},"\u5b9e\u4f53\u6570\u636e\u76d1\u542c\u5668")," \u6587\u6863\u4e66\u5199\u9519\u8bef bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/pulls/83/files"},"#PR83")),Object(b.b)("li",{parentName:"ul"},"[\u66f4\u65b0]"," \u6570\u636e\u5e93\u4e0a\u4e0b\u6587\u3001\u591a\u6570\u636e\u5e93\u3001\u811a\u624b\u67b6\u7b49\u6587\u6863"))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u95ee\u7b54\u7b54\u7591")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u5efa\u8bae]"," \u5e0c\u671b ",Object(b.b)("inlineCode",{parentName:"li"},"api")," \u8fd4\u56de\u7684\u503c\u81ea\u52a8\u5c06 null \u8f6c\u4e3a '' \u6216 ","[][#I286IJ]","(",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I286IJ)%EF%BC%8C%E3%80%90%E5%B7%B2%E5%85%B3%E9%97%AD%E3%80%91"},"https://gitee.com/dotnetchina/Furion/issues/I286IJ)\uff0c\u3010\u5df2\u5173\u95ed\u3011")),Object(b.b)("li",{parentName:"ul"},"[\u5efa\u8bae]"," \u6dfb\u52a0\u7f51\u5173\u529f\u80fd ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I27TP7"},"#I27TP7"),"\uff0c\u3010\u5df2\u5173\u95ed\u3011"),Object(b.b)("li",{parentName:"ul"},"[\u5efa\u8bae]"," \u65b0\u589e ",Object(b.b)("inlineCode",{parentName:"li"},"SqlQuery")," \u83b7\u53d6\u5355\u6761\u8bb0\u5f55\u65b9\u6cd5 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I28M1V"},"#I28M1V"),"\uff0c\u3010\u5df2\u5173\u95ed\u3011"),Object(b.b)("li",{parentName:"ul"},"[\u5efa\u8bae]"," \u5e0c\u671b\u53ef\u4ee5\u63d0\u4f9b\u96c6\u6210 ",Object(b.b)("inlineCode",{parentName:"li"},"Serilog")," \u4f8b\u5b50 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I282J4"},"#I282J4"),"\uff0c\u3010\u5df2\u5173\u95ed\u3011"),Object(b.b)("li",{parentName:"ul"},"[\u7591\u95ee]"," \u5982\u4f55\u901a\u8fc7\u7279\u6027\u914d\u7f6e\u552f\u4e00\u7ea6\u675f ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2891L"},"#I2891L"),"\uff0c\u3010\u5df2\u5173\u95ed\u3011"),Object(b.b)("li",{parentName:"ul"},"[\u7591\u95ee]"," \u600e\u4e48\u8bfb\u53d6 ",Object(b.b)("inlineCode",{parentName:"li"},"appsettings.json")," \u6570\u7ec4 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I27WUR"},"#I27WU"),"\uff0c\u3010\u5df2\u5173\u95ed\u3011"),Object(b.b)("li",{parentName:"ul"},"[\u7591\u95ee]"," ",Object(b.b)("inlineCode",{parentName:"li"},"IRepository")," \u51fa\u73b0\u7a7a\u5f02\u5e38 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I281IE"},"#I281IE"),"\uff0c\u3010\u5df2\u5173\u95ed\u3011"),Object(b.b)("li",{parentName:"ul"},"[\u7591\u95ee]"," \u89c4\u8303\u5316\u63a5\u53e3\u95ee\u9898\u95ee\u9898 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I28NMZ"},"#I28NMZ"),"\uff0c\u3010\u5df2\u5173\u95ed\u3011"),Object(b.b)("li",{parentName:"ul"},"[\u7591\u95ee]"," \u7edf\u4e00\u8fd4\u56de\u503c\u6a21\u578b\u4e2d OnResponseStatusCodes \u672a\u6267\u884c ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I28NNL"},"#I28NNL"),"\uff0c\u3010\u5df2\u5173\u95ed\u3011")))),Object(b.b)("hr",null),Object(b.b)("h2",{id:"v120\uff08\u5df2\u53d1\u5e03\uff09"},"v1.2.0\uff08\u5df2\u53d1\u5e03\uff09"),Object(b.b)("ul",null,Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u65b0\u7279\u6027")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u96ea\u82b1\u7b97\u6cd5 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I26OXG"},"#I26OXG"),", ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/pulls/78"},"#PR78")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"[AppDbContext]")," \u914d\u7f6e\u6570\u636e\u5e93\u63d0\u4f9b\u5668\u652f\u6301 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I27G3T"},"#I27G3T")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u5b9e\u4f53\u8868\u6570\u636e\u66f4\u6539\u76d1\u542c\u63a5\u53e3 ",Object(b.b)("inlineCode",{parentName:"li"},"IEntityDataChangedListener")," ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I278DD"},"#I278DD"),", ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I278LQ"},"#I278LQ")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u5168\u5c40\u670d\u52a1\u63a5\u53e3 AOP \u62e6\u622a\u529f\u80fd ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I278CP"},"#I278CP")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u5b9a\u4f4d\u5668\u4ed3\u50a8 ",Object(b.b)("inlineCode",{parentName:"li"},"IDbRepository")," ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I276Q3"},"#I276Q3")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u6570\u636e\u5e93\u64cd\u4f5c ",Object(b.b)("inlineCode",{parentName:"li"},"InsertOrUpdate")," \u652f\u6301\u6392\u9664\u7a7a\u5b57\u7b26\u4e32\u529f\u80fd ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I272OG"},"#I272OG")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u6570\u636e\u5e93\u64cd\u4f5c ",Object(b.b)("inlineCode",{parentName:"li"},"UpdateInclude")," \u548c ",Object(b.b)("inlineCode",{parentName:"li"},"UpdateExclude")," \u533f\u540d\u5bf9\u8c61\u652f\u6301 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I271X0"},"#I271X0")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u6570\u636e\u9a8c\u8bc1\u4f20\u5165\u7a7a\u5bf9\u8c61\u8df3\u8fc7\u9a8c\u8bc1\u652f\u6301 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I273R4"},"#I273R4")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u5e94\u7528\u542f\u52a8\u65f6\u652f\u6301\u6392\u9664\u7279\u5b9a\u914d\u7f6e\u6587\u4ef6\u81ea\u52a8\u52a0\u8f7d ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I26U0A"},"#I26U0A")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u5355\u4e2a\u5b9e\u4f53\u8868\u540d\u524d\u7f00\u652f\u6301 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I26LX0"},"#I26LX0")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"MySql")," \u6570\u636e\u5e93\u81ea\u52a8\u914d\u7f6e\u9ed8\u8ba4\u7248\u672c\u53f7 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I26XQ6"},"#I26XQ6")),Object(b.b)("li",{parentName:"ul"},"[\u4f18\u5316]"," \u6388\u6743\u5904\u7406\u7a0b\u5e8f\u4ee3\u7801"))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u7a81\u7834\u6027\u53d8\u5316")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u5b9e\u4f53\u8868\u6570\u636e\u66f4\u6539\u76d1\u542c\u63a5\u53e3 ",Object(b.b)("inlineCode",{parentName:"li"},"IEntityDataChangedListener")," ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I278DD"},"#I278DD"),", ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I278LQ"},"#I278LQ")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u5168\u5c40\u670d\u52a1\u63a5\u53e3 AOP \u62e6\u622a\u529f\u80fd ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I278CP"},"#I278CP")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u96ea\u82b1\u7b97\u6cd5 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I26OXG"},"#I26OXG"),", ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/pulls/78"},"#PR78")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u95ee\u9898\u4fee\u590d")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u89c6\u56fe\u5f15\u64ce\u52a0\u8f7d\u5916\u90e8\u7a0b\u5e8f\u96c6\u51fa\u9519 bug"),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u4f9d\u8d56\u6ce8\u5165\u4ee3\u7406\u63a5\u53e3\u62a5\u7a7a\u5bf9\u8c61\u5f02\u5e38 bug"),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"EFCore")," \u53d6\u6d88\u9644\u52a0\u5b9e\u4f53\u51fa\u9519 bug"),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u6570\u636e\u5e93\u4ed3\u50a8\u5728\u975e Web \u8bf7\u6c42\u4e0b\u51fa\u73b0\u7a7a\u5f02\u5e38 bug"),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u591a\u4e2a\u6388\u6743\u7b56\u7565\u5171\u5b58\u95ee\u9898\u51fa\u73b0\u65e0\u6548 bug"),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u53cb\u597d\u5f02\u5e38 ",Object(b.b)("inlineCode",{parentName:"li"},"Oop.Oh")," \u4e0d\u652f\u6301\u666e\u901a\u65b9\u6cd5 bug"),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u83b7\u53d6\u591a\u79df\u6237\u5bf9\u8c61\u65f6\u6570\u636e\u5e93\u4e0a\u4e0b\u6587\u51fa\u73b0\u4f5c\u7528\u57df\u9a8c\u8bc1\u5931\u8d25 bug"),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u5de5\u4f5c\u5355\u5143\u4e0d\u652f\u6301 ",Object(b.b)("inlineCode",{parentName:"li"},"Sql\u4ee3\u7406")," \u62e6\u622a bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I27GST"},"#I27GST")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u5176\u4ed6\u66f4\u6539")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u5173\u95ed][#I26O1F]","(",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I26O1F"},"https://gitee.com/dotnetchina/Furion/issues/I26O1F"),"), ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I27B2I"},"#I27B2I"),", ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I27BJ6"},"#I27BJ6"),", ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I27E5Z"},"#I27E5Z"),", ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I27EL4"},"#I27EL4")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u6587\u6863\u53d8\u5316")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e][\u5b9e\u4f53\u6570\u636e\u76d1\u542c\u5668]","(",Object(b.b)("a",{parentName:"li",href:"https://dotnetchina.gitee.io/furion/docs/dbcontext-entitytrigger"},"https://dotnetchina.gitee.io/furion/docs/dbcontext-entitytrigger"),") \u6587\u6863"),Object(b.b)("li",{parentName:"ul"},"[\u66f4\u65b0]"," \u4e00\u5206\u949f\u5165\u95e8\u3001\u5e94\u7528\u542f\u52a8\u3001\u5b98\u65b9\u811a\u624b\u67b6\u3001\u6570\u636e\u5e93\u64cd\u4f5c\u6307\u5357\u3001\u5bf9\u8c61\u6620\u5c04\u3001\u89c4\u8303\u5316\u6587\u6863\u3001\u5f02\u5e38\u5904\u7406\u3001\u9274\u6743\u6388\u6743\u6587\u6863")))),Object(b.b)("hr",null),Object(b.b)("h2",{id:"v110\uff08\u5df2\u53d1\u5e03\uff09"},"v1.1.0\uff08\u5df2\u53d1\u5e03\uff09"),Object(b.b)("ul",null,Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u65b0\u7279\u6027")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Db.GetDbContext()")," \u83b7\u53d6\u9ed8\u8ba4\u6570\u636e\u5e93\u4e0a\u4e0b\u6587\u65b9\u6cd5"),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"HttpContextUtility.GetCurrentHttpContext()")," \u83b7\u53d6\u5168\u5c40 ",Object(b.b)("inlineCode",{parentName:"li"},"HttpContext")," \u4e0a\u4e0b\u6587"),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"App.GetRequiredService<>")," \u89e3\u6790\u670d\u52a1\u65b9\u6cd5"),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"object.GetService<>")," \u5bf9\u8c61\u62d3\u5c55\u65b9\u6cd5"),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u7b56\u7565\u6388\u6743 ",Object(b.b)("inlineCode",{parentName:"li"},"PolicyPipeline")," \u57fa\u7c7b\u65b9\u6cd5\uff0c\u652f\u6301\u591a\u91cd\u5224\u65ad\u6388\u6743"),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"JWTEncryption.ValidateJwtBearerToken")," \u624b\u52a8\u9a8c\u8bc1\u9759\u6001\u65b9\u6cd5"),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u5168\u5c40\u6570\u636e\u5e93\u4e0a\u4e0b\u6587 ",Object(b.b)("inlineCode",{parentName:"li"},"InsertOrUpdateIgnoreNullValues")," \u548c ",Object(b.b)("inlineCode",{parentName:"li"},"EnabledEntityStateTracked")," \u5168\u5c40\u914d\u7f6e"),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Swagger Jwt\u6388\u6743")," \u5168\u5c40\u6388\u6743\u53c2\u6570 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I26GLR"},"#I26GLR")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"InsertOrUpdate")," \u652f\u6301\u81ea\u5b9a\u4e49\u5224\u65ad\u6761\u4ef6\u529f\u80fd ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I269Q1"},"#I269Q1")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u5b57\u7b26\u4e32\u5b57\u6bb5\u5c0f\u5199\u547d\u540d\u652f\u6301 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2695D"},"#I2695D")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u5b57\u7b26\u4e32\u6587\u672c\u5bf9\u6bd4\u529f\u80fd ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I268LE"},"#I268LE")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u5168\u5c40\u5f02\u5e38\u7279\u6027\u6d88\u606f\u529f\u80fd ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2662O"},"#I2662O")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Insert")," \u6216 ",Object(b.b)("inlineCode",{parentName:"li"},"Update")," \u6570\u636e\u5e93\u5ffd\u7565\u7a7a\u503c\u529f\u80fd ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I264Q4"},"#I264Q4")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u7a81\u7834\u6027\u53d8\u5316")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Fur")," \u9879\u76ee\u540d\u4e3a ",Object(b.b)("inlineCode",{parentName:"li"},"Furion")),Object(b.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Db.GetRequestDbContext<>()")," \u547d\u540d\u4e3a ",Object(b.b)("inlineCode",{parentName:"li"},"Db.GetDbContext<>()")),Object(b.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Db.GetDbContext<>()")," \u547d\u540d\u4e3a ",Object(b.b)("inlineCode",{parentName:"li"},"Db.GetDuplicateDbContext<>()")),Object(b.b)("li",{parentName:"ul"},"[\u91cd\u6784]"," ",Object(b.b)("inlineCode",{parentName:"li"},"App.GetService<>")," \u89e3\u6790\u670d\u52a1\u7684\u5e95\u5c42\u903b\u8f91\uff0c\u5927\u5927\u63d0\u9ad8\u4e86\u89e3\u6790\u670d\u52a1\u7684\u6027\u80fd"),Object(b.b)("li",{parentName:"ul"},"[\u91cd\u6784]"," \u6388\u6743\u6838\u5fc3\u4ee3\u7801\uff0c\u4fdd\u6301\u548c\u5fae\u8f6f\u4e00\u81f4\u7684\u6388\u6743\u89c4\u8303 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I26DCB"},"#I26DCB")),Object(b.b)("li",{parentName:"ul"},"[\u79fb\u9664]"," ",Object(b.b)("inlineCode",{parentName:"li"},"App.GetRequestService<>")," \u65b9\u6cd5"),Object(b.b)("li",{parentName:"ul"},"[\u79fb\u9664]"," ",Object(b.b)("inlineCode",{parentName:"li"},"ValidateJwtBearer")," Jwt \u6388\u6743\u65b9\u6cd5\uff0c\u65e0\u9700\u624b\u52a8\u5224\u65ad\u4e86"))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u95ee\u9898\u4fee\u590d")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," Furion \u5b98\u65b9\u811a\u624b\u67b6\u751f\u6210\u540e\u7f16\u8bd1\u5f02\u5e38 bug"),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Tenant")," \u5185\u7f6e\u5c5e\u6027\u4e0d\u662f ",Object(b.b)("inlineCode",{parentName:"li"},"virtual")," \u4fee\u9970 bug"),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"dockerfile")," \u65b0\u547d\u540d\u6784\u5efa\u5931\u8d25 bug"),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u81ea\u5b9a\u4e49\u89d2\u8272\u6388\u6743\u548c\u591a\u4e2a\u6388\u6743\u5171\u5b58\u51fa\u73b0 403 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I26H1L"},"#I26H1L")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"httpContext.GetEndpoint()")," \u7a7a\u5f02\u5e38 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/pulls/73"},"#PR73")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Oops.Oh")," \u7a7a\u5f02\u5e38\u548c\u4e0d\u652f\u6301\u670d\u52a1\u670d\u52a1\u629b\u5f02\u5e38 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I26EFU"},"#I26EFU"),"\uff0c",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I26GM4"},"#I26GM4")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"cli.ps")," \u751f\u6210\u6587\u4ef6\u7f16\u7801\u4e71\u7801 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I26DVT"},"#I26DVT")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Swagger")," \u6587\u4ef6\u4e0a\u4f20\u6309\u94ae\u4e0d\u663e\u793a ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I26B6U"},"#I26B6U")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u89c4\u8303\u5316\u7ed3\u679c\u6388\u6743\u72b6\u6001\u7801\u5e8f\u5217\u5316\u5927\u5c0f\u5199\u4e0d\u4e00\u81f4\u95ee\u9898 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I26B26"},"#I26B26")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u672a\u542f\u7528\u89c4\u8303\u5316\u7ed3\u679c\u65f6\u4e2d\u6587\u4e71\u7801 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I268T5"},"#I268T5")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"MySql")," \u5f02\u6b65\u5f02\u5e38\u6355\u83b7\u4e0d\u5230 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I265SO"},"#I265SO")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"cli.ps1")," \u63d0\u793a\u627e\u4e0d\u5230\u6570\u636e\u5e93\u8fde\u63a5\u5b57\u7b26\u4e32 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2647U"},"#I2647U")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u5176\u4ed6\u66f4\u6539")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u5176\u4ed6]"," \u4ee3\u7801\u6027\u80fd\u5c0f\u4f18\u5316\u548c\u5c0f\u8c03\u6574"),Object(b.b)("li",{parentName:"ul"},"[\u5173\u95ed][#I265JV]","(",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I265JV)%EF%BC%8C%5B#I26ERA%5D(https://gitee.com/dotnetchina/Furion/issues/I26ERA)%EF%BC%8C"},"https://gitee.com/dotnetchina/Furion/issues/I265JV)\uff0c[#I26ERA](https://gitee.com/dotnetchina/Furion/issues/I26ERA)\uff0c")," ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I26EVW"},"#I26EVW"),"\uff0c",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I26GHC"},"#I26GHC"),"\uff0c",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I26GJ1"},"#I26GJ1"),"\uff0c",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I26O1F"},"#I26O1F")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u6587\u6863\u53d8\u5316")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u66f4\u65b0]"," \u4e00\u5206\u949f\u5165\u95e8\u3001\u5b89\u5168\u9274\u6743\u3001\u6570\u636e\u5e93\u7b49\u6587\u6863")))),Object(b.b)("hr",null),Object(b.b)("h2",{id:"v103\uff08\u5df2\u53d1\u5e03\uff09"},"v1.0.3\uff08\u5df2\u53d1\u5e03\uff09"),Object(b.b)("ul",null,Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u65b0\u7279\u6027")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," Mvc \u6a21\u677f\u811a\u624b\u67b6\uff1a",Object(b.b)("inlineCode",{parentName:"li"},"Fur.Template.Mvc")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," WebApi \u6a21\u677f\uff1a",Object(b.b)("inlineCode",{parentName:"li"},"Fur.Template.Api")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," Mvc/WebApi \u6a21\u677f\uff1a",Object(b.b)("inlineCode",{parentName:"li"},"Fur.Template.App")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," Razar Pages \u6a21\u677f\uff1a",Object(b.b)("inlineCode",{parentName:"li"},"Fur.Template.Razor")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," Blazor \u6a21\u677f\uff1a",Object(b.b)("inlineCode",{parentName:"li"},"Fur.Template.Blazor")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u7a81\u7834\u6027\u53d8\u5316")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," ",Object(b.b)("inlineCode",{parentName:"li"},"PagedList")," \u5230 ",Object(b.b)("inlineCode",{parentName:"li"},"System.Collections.Generic")," \u547d\u540d\u7a7a\u95f4\u4e0b"),Object(b.b)("li",{parentName:"ul"},"[\u4f18\u5316]"," \u89e3\u6790\u670d\u52a1\u6027\u80fd\u95ee\u9898\uff0c\u5e95\u5c42\u4ee3\u7801\u5927\u91cf\u4f18\u5316"))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u95ee\u9898\u4fee\u590d")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"ApiSears.ControllerEnd"),"\u4e0d\u8d77\u4f5c\u7528 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I25KH6"},"#I25KH6")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"RemoteRequest")," \u8bf7\u6c42\u5b8c\u6210\u7ed3\u679c\u5e8f\u5217\u5316\u5c5e\u6027\u5927\u5c0f\u5199\u95ee\u9898 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I25I8R"},"#I25I8R")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"HttpContext.GetEndpoinet()")," \u7a7a\u5f02\u5e38 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/pulls/73"},"#PR73")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u5176\u4ed6\u66f4\u6539")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"\u65e0"))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u6587\u6863\u53d8\u5316")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u66f4\u65b0]"," \u5165\u95e8\u6587\u6863\u3001\u6570\u636e\u5e93\u4e0a\u4e0b\u6587\u6587\u6863\u3001\u591a\u6570\u636e\u5e93\u64cd\u4f5c\u6587\u6863")))),Object(b.b)("hr",null),Object(b.b)("h2",{id:"v102\uff08\u5df2\u53d1\u5e03\uff09"},"v1.0.2\uff08\u5df2\u53d1\u5e03\uff09"),Object(b.b)("ul",null,Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u65b0\u7279\u6027")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Pomelo.EntityFrameworkCore.MySql")," \u6700\u65b0 .NET 5 \u5305\u914d\u7f6e ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I24ZQK"},"#I24ZQK")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},".AddDateTimeJsonConverter(format)")," \u65f6\u95f4\u683c\u5f0f\u5e8f\u5217\u5316\u914d\u7f6e"),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"DateTime")," \u548c ",Object(b.b)("inlineCode",{parentName:"li"},"DateTimeOffset")," \u7c7b\u578b\u5e8f\u5217\u5316\u683c\u5f0f\u914d\u7f6e ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I253FI"},"#I253FI")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u7a81\u7834\u6027\u53d8\u5316")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u66f4\u65b0]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Mapster")," \u5305\u81f3 ",Object(b.b)("inlineCode",{parentName:"li"},"7.0.0")," \u7248"),Object(b.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," ",Object(b.b)("inlineCode",{parentName:"li"},"App.Services")," \u540d\u4e3a ",Object(b.b)("inlineCode",{parentName:"li"},"App.ServiceProvider")),Object(b.b)("li",{parentName:"ul"},"[\u79fb\u9664]"," ",Object(b.b)("inlineCode",{parentName:"li"},"App.ApplicationServices")," \u548c ",Object(b.b)("inlineCode",{parentName:"li"},"App.GetRequestService<>()")),Object(b.b)("li",{parentName:"ul"},"[\u79fb\u9664]"," \u975e Web \u4e3b\u673a\u6ce8\u5165\u62d3\u5c55"))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u95ee\u9898\u4fee\u590d")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"services.AddFriendlyException()")," \u7f3a\u5c11\u914d\u7f6e\u6ce8\u5165 bug"),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u6570\u636e\u5e93\u4e0a\u4e0b\u6587\u6c60\u88ab\u91ca\u653e\u548c\u9ad8\u5e76\u53d1\u4e0b\u5185\u5b58\u6ea2\u51fa bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2524K"},"#I2524K"),"\uff0c",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I24UMN"},"#I24UMN")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Sql\u4ee3\u7406")," \u8fd4\u56de\u7a7a\u6570\u636e\u65f6\u5f02\u5e38 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I24TCK"},"#I24TCK")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u5de5\u4f5c\u5355\u5143 ",Object(b.b)("inlineCode",{parentName:"li"},"[UnitOfWork]")," \u591a\u6570\u636e\u5e93\u88ab\u91ca\u653e bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I24Q6W"},"#I24Q6W")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u5176\u4ed6\u66f4\u6539")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," ",Object(b.b)("inlineCode",{parentName:"li"},"EntityBase")," \u548c ",Object(b.b)("inlineCode",{parentName:"li"},"Entity")," \u6240\u6709\u5c5e\u6027\u4e3a ",Object(b.b)("inlineCode",{parentName:"li"},"vitural")," \u4fee\u9970"),Object(b.b)("li",{parentName:"ul"},"[\u4f18\u5316]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Jwt")," \u8bfb\u53d6\u548c\u89e3\u6790\u6027\u80fd"),Object(b.b)("li",{parentName:"ul"},"[\u4f18\u5316]"," \u4f18\u5316\u4ee3\u7801\u652f\u6301 C# 9.0 \u6700\u65b0\u8bed\u6cd5"),Object(b.b)("li",{parentName:"ul"},"[\u4f18\u5316]"," ",Object(b.b)("inlineCode",{parentName:"li"},"MD5")," \u52a0\u5bc6\u6027\u80fd ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/pulls/71"},"#PR71")),Object(b.b)("li",{parentName:"ul"},"[\u79fb\u9664]"," \u65e0\u7528\u6216\u672a\u4f7f\u7528\u4ee3\u7801"))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u6587\u6863")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u66f4\u65b0]"," \u6570\u636e\u5e93\u4e0a\u4e0b\u6587\u3001\u591a\u6570\u636e\u5e93\u3001\u4e00\u5206\u949f\u5165\u95e8\u6587\u6863")))),Object(b.b)("hr",null),Object(b.b)("h2",{id:"v100\uff08\u5df2\u53d1\u5e03\uff09"},"v1.0.0\uff08\u5df2\u53d1\u5e03\uff09"),Object(b.b)("ul",null,Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u65b0\u7279\u6027")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u7f51\u7edc\u8bf7\u6c42 ",Object(b.b)("inlineCode",{parentName:"li"},"RemoteRequest")," \u7ec4\u4ef6 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I1YYWD"},"#I1YYWD")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},".AddInjectBase()")," \u6ce8\u5165\uff0c\u53ea\u5305\u542b\u57fa\u7840\u670d\u52a1\u6ce8\u5165"),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u6240\u6709\u670d\u52a1\u90fd\u652f\u6301 ",Object(b.b)("inlineCode",{parentName:"li"},"IServiceCollection")," \u548c ",Object(b.b)("inlineCode",{parentName:"li"},"IMvcBuilder")," \u6ce8\u5165"),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u629b\u5f02\u5e38\u72b6\u6001\u7801\u8bbe\u7f6e\u529f\u80fd ",Object(b.b)("inlineCode",{parentName:"li"},"StatusCode")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Swagger")," \u5e8f\u5217\u5316\u652f\u6301 ",Object(b.b)("inlineCode",{parentName:"li"},"Pascal")," \u5c5e\u6027\u547d\u540d\u65b9\u5f0f"))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u7a81\u7834\u6027\u53d8\u5316")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u66f4\u65b0]"," ",Object(b.b)("strong",{parentName:"li"},"\u6240\u6709\u7684\u5305\u4e3a ",Object(b.b)("inlineCode",{parentName:"strong"},".NET 5")," \u6b63\u5f0f\u7248")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u95ee\u9898\u4fee\u590d")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"SqlProxy")," \u4ee3\u7406\u5f02\u6b65\u5904\u7406 bug"),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u6570\u636e\u5e93\u7c7b\u578b ",Object(b.b)("inlineCode",{parentName:"li"},"Datetime")," \u8f6c ",Object(b.b)("inlineCode",{parentName:"li"},"DateTimeOffset")," bug"),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u5c5e\u6027\u9996\u5b57\u6bcd\u5927\u5c0f\u5199\u5e8f\u5217\u5316\u4e0d\u5339\u914d\u51fa\u73b0 ",Object(b.b)("inlineCode",{parentName:"li"},"null")," bug"),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u5bf9\u8c61\u5e8f\u5217\u5316\u4e2d\u6587\u51fa\u73b0\u4e71\u7801 bug"),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u9ed8\u8ba4\u5e8f\u5217\u5316\u914d\u7f6e\u65e0\u6548 bug"),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u6570\u636e\u5e93\u975e\u4f9d\u8d56\u6ce8\u5165\u65b9\u5f0f\u63d0\u4ea4\u65e0\u6548 bug"),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u5e94\u7528\u7a0b\u5e8f\u6c60\u63d0\u4ea4\u6240\u6709 ",Object(b.b)("inlineCode",{parentName:"li"},"DbContext")," \u7a7a\u5f02\u5e38 bug"),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Saas")," \u591a\u79df\u6237 ",Object(b.b)("inlineCode",{parentName:"li"},"Tenant")," \u7c7b\u578b\u5b57\u7b26\u4e32\u5c5e\u6027\u5728 ",Object(b.b)("inlineCode",{parentName:"li"},"MySql")," \u6570\u636e\u5e93\u4e0b\u51fa\u73b0 ",Object(b.b)("inlineCode",{parentName:"li"},"longtext")," \u7c7b\u578b bug"),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Mvc")," \u81ea\u52a8\u9a8c\u8bc1\u5b57\u7b26\u4e32\u7a7a\u503c bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I24M2T"},"#I24M2T")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u679a\u4e3e\u6ce8\u91ca\u88ab\u8986\u76d6 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I24N6J"},"#I24N6J")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u5ffd\u7565\u89c4\u8303\u5316\u7ed3\u679c\u65e0\u6548 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I24B8P"},"#I24B8P")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Swagger")," \u9ed8\u8ba4 ",Object(b.b)("inlineCode",{parentName:"li"},"ContentType")," \u4e0d\u662f ",Object(b.b)("inlineCode",{parentName:"li"},"applicaiton/json")," bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I24F3U"},"#I24F3U")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u5185\u7f6e ",Object(b.b)("inlineCode",{parentName:"li"},"System.Text.Json")," \u548c ",Object(b.b)("inlineCode",{parentName:"li"},"Newtonsoft.Json")," \u51b2\u7a81 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I24F3U"},"#I24F3U")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u5176\u4ed6\u66f4\u6539")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Fur")," \u6846\u67b6\u57df\u540d\u4e3a\uff1a",Object(b.b)("a",{parentName:"li",href:"https://furion.pro"},"https://furion.pro")),Object(b.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," \u4ed3\u50a8 ",Object(b.b)("inlineCode",{parentName:"li"},"FromSqlRaw")," \u548c ",Object(b.b)("inlineCode",{parentName:"li"},"FromSqlInterpolated")," \u63a5\u53e3\u4f4d\u7f6e"),Object(b.b)("li",{parentName:"ul"},"[\u4f18\u5316]"," \u6570\u636e\u52a0\u89e3\u5bc6\u6027\u80fd\uff0c",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/pulls/70"},"#PR70")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u6587\u6863")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u66f4\u65b0]"," README.md\u3001\u6846\u67b6\u4ecb\u7ecd\u3001\u6570\u636e\u5e93\u4e0a\u4e0b\u6587\u3001\u914d\u7f6e\u9009\u9879\u3001\u591a\u79df\u6237\u3001\u8de8\u57df\u6587\u6863")))))}o.isMDXComponent=!0},205:function(e,t,a){"use strict";a.d(t,"a",(function(){return m})),a.d(t,"b",(function(){return O}));var i=a(0),n=a.n(i);function b(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function r(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,i)}return a}function l(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var b=Object.getOwnPropertySymbols(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var p=n.a.createContext({}),o=function(e){var t=n.a.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},m=function(e){var t=o(e.components);return n.a.createElement(p.Provider,{value:t},e.children)},s={inlineCode:"code",wrapper:function(e){var t=e.children;return n.a.createElement(n.a.Fragment,{},t)}},u=n.a.forwardRef((function(e,t){var a=e.components,i=e.mdxType,b=e.originalType,r=e.parentName,p=c(e,["components","mdxType","originalType","parentName"]),m=o(a),u=i,O=m["".concat(r,".").concat(u)]||m[u]||s[u]||b;return a?n.a.createElement(O,l(l({ref:t},p),{},{components:a})):n.a.createElement(O,l({ref:t},p))}));function O(e,t){var a=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var b=a.length,r=new Array(b);r[0]=u;var l={};for(var c in t)hasOwnProperty.call(t,c)&&(l[c]=t[c]);l.originalType=e,l.mdxType="string"==typeof e?e:i,r[1]=l;for(var p=2;p")," \u6dfb\u52a0 ",Object(b.b)("inlineCode",{parentName:"li"},"Mvc")," \u8fc7\u6ee4\u5668\u62d3\u5c55 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I368BH"},"#I368BH")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u7a81\u7834\u6027\u53d8\u5316")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u5347\u7ea7]"," \u6846\u67b6\u4f9d\u8d56\u7684 .NET 5 SDK \u81f3\u6700\u65b0\u7248 5.0.3 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I37YQQ"},"#I37YQQ")),Object(b.b)("li",{parentName:"ul"},"[\u5347\u7ea7]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Swashbuckle.AspNetCore")," \u7ec4\u4ef6\u5305\u5230 ",Object(b.b)("inlineCode",{parentName:"li"},"6.0.x")," \u7248\u672c ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I37EZK"},"#I37EZK")),Object(b.b)("li",{parentName:"ul"},"[\u79fb\u9664]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Furion")," \u6846\u67b6 ",Object(b.b)("inlineCode",{parentName:"li"},"JWT")," \u62d3\u5c55\u7c7b\uff0c\u53ea\u5728 ",Object(b.b)("inlineCode",{parentName:"li"},"Furion.Extras.Authentication.JwtBearer")," \u4e2d\u4fdd\u7559 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I35D59"},"#I35D59")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u95ee\u9898\u4fee\u590d")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u4f20\u5165\u9519\u8bef ",Object(b.b)("inlineCode",{parentName:"li"},"JWT Token")," \u5b57\u7b26\u4e32\u5bfc\u81f4\u81ea\u52a8\u5237\u65b0 ",Object(b.b)("inlineCode",{parentName:"li"},"Token")," \u51fa\u73b0\u5b57\u7b26\u4e32\u8fb9\u754c\u503c\u5f02\u5e38 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I34ZE5"},"#I34ZE5")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u77ac\u65f6\u4f5c\u7528\u57df\u6570\u636e\u5e93\u4e0a\u4e0b\u6587\u4e5f\u4f1a\u81ea\u52a8\u52a0\u5165\u5de5\u4f5c\u5355\u5143\u5bfc\u81f4\u5199\u65e5\u5fd7\u65f6\u8fde\u9501\u5f02\u5e38 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I37WTV"},"#I37WTV")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u5176\u4ed6\u66f4\u6539")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u4f18\u5316]"," \u83b7\u53d6\u7cfb\u7edf\u73af\u5883\u53c2\u6570\u7684\u6027\u80fd ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I36SR5"},"#I36SR5")),Object(b.b)("li",{parentName:"ul"},"[\u4f18\u5316]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Furion")," \u5e95\u5c42\u6dfb\u52a0 ",Object(b.b)("inlineCode",{parentName:"li"},"Mvc")," \u8fc7\u6ee4\u5668\u4ee3\u7801 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I36SKA"},"#I36SKA")),Object(b.b)("li",{parentName:"ul"},"[\u4f18\u5316]"," \u6dfb\u52a0\u9ed8\u8ba4 ",Object(b.b)("inlineCode",{parentName:"li"},"Json")," \u5e8f\u5217\u5316\u65f6\u95f4\u9ed8\u8ba4\u65f6\u95f4\u683c\u5f0f ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I36SL0"},"#I36SL0")),Object(b.b)("li",{parentName:"ul"},"[\u5347\u7ea7]"," \u5347\u7ea7 ",Object(b.b)("inlineCode",{parentName:"li"},"SqlSugar")," \u62d3\u5c55\u5305\u5230 ",Object(b.b)("inlineCode",{parentName:"li"},"5.0.2.6")," \u7248\u672c ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I36SIG"},"#I36SIG")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u6587\u6863\u53d8\u5316")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u6570\u636e\u5e93\u5165\u95e8\u6587\u6863 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I37Z8S"},"#I37Z8S")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u66f4\u65b0\u65e5\u5fd7\u6587\u6863 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I36PI0"},"#I36PI0")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u8bf7\u6c42\u5ba1\u8ba1\u65e5\u5fd7\u3001\u6267\u884c ",Object(b.b)("inlineCode",{parentName:"li"},"Sql")," \u66f4\u65b0\u65e5\u5fd7\u6587\u6863 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I36PIK"},"#I36PIK")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u524d\u7aef\u4f7f\u7528 ",Object(b.b)("inlineCode",{parentName:"li"},"axios")," \u8de8\u57df\u914d\u7f6e\u6587\u6863 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I36PIT"},"#I36PIT")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"App")," \u9759\u6001\u7c7b\u83b7\u53d6\u5e94\u7528\u3001\u73af\u5883\u66f4\u591a\u4fe1\u606f\u6570\u636e ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I36SOV"},"#I36SOV")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u82f1\u6587\u7248 ",Object(b.b)("inlineCode",{parentName:"li"},"README.md")," \u4ecb\u7ecd ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I37QHP"},"#I37QHP")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u95ee\u7b54\u7b54\u7591"))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u4e0d\u505a\u5b9e\u73b0")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u591a\u8bed\u8a00\u8d44\u6e90\u6587\u4ef6\u81ea\u52a8\u521b\u5efa ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I35AA4"},"#I35AA4")),Object(b.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u5efa\u8bae\u591a\u8bed\u8a00\u52a0\u4e0a\u7ef4\u543e\u5c14\u8bed\u652f\u6301 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I37X1L"},"#I37X1L"))))),Object(b.b)("hr",null),Object(b.b)("h2",{id:"v1130\uff08\u5df2\u53d1\u5e03\uff09"},"v1.13.0\uff08\u5df2\u53d1\u5e03\uff09"),Object(b.b)("ul",null,Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u65b0\u7279\u6027")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u591a\u8bed\u8a00\u529f\u80fd\u53ca\u62d3\u5c55 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2DOCL"},"#I2DOCL")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u4e8b\u4ef6\u603b\u7ebf\u529f\u80fd\u53ca\u6d88\u606f\u4e2d\u5fc3 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I23BKN"},"#I23BKN")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Swagger")," \u5206\u7ec4\u663e\u793a\u9690\u85cf\u914d\u7f6e ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2AHH8"},"#I2AHH8")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Furion.Extras.Logging.Serilog")," \u62d3\u5c55\u63d2\u4ef6 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2AAN8"},"#I2AAN8")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"cli.ps")," \u652f\u6301 ",Object(b.b)("inlineCode",{parentName:"li"},"-Namespace")," \u547d\u540d\u7a7a\u95f4\u6307\u5b9a ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2A175"},"#I2A175")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Swagger")," \u89c4\u8303\u5316\u5316\u6587\u6863\u6388\u6743\u5931\u6548\u540e\u81ea\u52a8\u53d6\u6d88\u6388\u6743\u9501 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2AIWC"},"#I2AIWC")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Request.Body")," \u652f\u6301\u91cd\u590d\u8bfb\u529f\u80fd\uff0c\u4e3b\u8981\u89e3\u51b3\u5fae\u4fe1 SDK \u95ee\u9898 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2AMG0"},"#I2AMG0")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u7f51\u7edc\u8bf7\u6c42\u529f\u80fd\u53ca\u6587\u6863 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2APGJ"},"#I2APGJ")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"SqlSugar")," \u62d3\u5c55\u5305\u652f\u6301\u6253\u5370 ",Object(b.b)("inlineCode",{parentName:"li"},"sql")," \u5230 ",Object(b.b)("inlineCode",{parentName:"li"},"MiniProfiler")," \u4e2d ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2ASLS"},"#I2ASLS")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Furion.Extras.DatabaseAccesssor.Dapper")," \u62d3\u5c55\u63d2\u4ef6 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2ASYA"},"#I2ASYA")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Furion.Extras.DatabaseAccessor.PetaPoco")," \u62d3\u5c55\u63d2\u4ef6 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2AUGA"},"#I2AUGA")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u7f51\u7edc\u8bf7\u6c42\u5b57\u7b26\u4e32\u62d3\u5c55\u65b9\u6cd5 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2CPQ0"},"#I2CPQ0")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"SqlSugar")," \u62d3\u5c55\u65b0\u589e ",Object(b.b)("inlineCode",{parentName:"li"},"PagedList")," \u62d3\u5c55 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2CW99"},"#I2CW99")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u8fdc\u7a0b\u8bf7\u6c42\u652f\u6301\u53c2\u6570\u7279\u6027\u9a8c\u8bc1 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2CX5L"},"#I2CX5L")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"App.User")," \u83b7\u53d6\u5f53\u524d\u6388\u6743\u7528\u6237\u4fe1\u606f\u4fbf\u6377\u65b9\u6cd5 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2CZLO"},"#I2CZLO")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u89c4\u8303\u5316\u6587\u6863\u53ef\u914d\u7f6e\u529f\u80fd\uff0c\u652f\u6301 ",Object(b.b)("inlineCode",{parentName:"li"},"appsettings.json")," \u914d\u7f6e ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2D1K9"},"#I2D1K9")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u8fdc\u7a0b\u8bf7\u6c42\u62e6\u622a\u5668\u6dfb\u52a0\u65b9\u6cd5\u548c\u65b9\u6cd5\u53c2\u6570 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2D2CM"},"#I2D2CM")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u8fdc\u7a0b\u8bf7\u6c42\u51fa\u9519\u8fd4\u56de\u9ed8\u8ba4\u503c\u652f\u6301 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2D44M"},"#I2D44M")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u8fdc\u7a0b\u8bf7\u6c42 ",Object(b.b)("inlineCode",{parentName:"li"},"body")," \u53c2\u6570\u5e8f\u5217\u5316\u652f\u6301\u8bbe\u7f6e ",Object(b.b)("inlineCode",{parentName:"li"},"PropertyNamingPolicy")," ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2D685"},"#I2D685")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u8fdc\u7a0b\u670d\u52a1\u63a5\u53e3\u5ba2\u6237\u7aef\u914d\u7f6e ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2D7PS"},"#I2D7PS")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"AddInject")," \u548c ",Object(b.b)("inlineCode",{parentName:"li"},"UseInject")," \u5141\u8bb8\u81ea\u5b9a\u4e49 ",Object(b.b)("inlineCode",{parentName:"li"},"SecurityDefinitions")," \u548c ",Object(b.b)("inlineCode",{parentName:"li"},"SwaggerUI")," ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2DIMG"},"#I2DIMG")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"[SecurityDefine]")," \u9ed8\u8ba4\u6784\u9020\u51fd\u6570 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2DNXT"},"#I2DNXT")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"AspectDispatchProxy")," \u52a8\u6001\u4ee3\u7406\u7c7b ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2DO6I"},"#I2DO6I")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"[QueryParameters]")," \u7279\u6027\uff0c\u652f\u6301\u4e00\u952e\u5c06 ",Object(b.b)("inlineCode",{parentName:"li"},"Action")," \u53c2\u6570\u6dfb\u52a0 ",Object(b.b)("inlineCode",{parentName:"li"},"[FromQuery]")," \u7279\u6027 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2G8TF"},"#I2G8TF")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u52a8\u6001\u65e5\u5fd7\u914d\u7f6e\u53ca\u62d3\u5c55\u65b9\u6cd5 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2GDGD"},"#I2GDGD")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"WebApi")," \u8bf7\u6c42\u8c13\u8bcd\u9ed8\u8ba4\u89c4\u5219\u914d\u7f6e\u529f\u80fd ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2M70X"},"#I2M70X")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u7a81\u7834\u6027\u53d8\u5316")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u5347\u7ea7]"," ",Object(b.b)("inlineCode",{parentName:"li"},".NET 5")," SDK \u5230 ",Object(b.b)("inlineCode",{parentName:"li"},".NET 5.0.2")," \u7248\u672c ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2D0PZ"},"#I2D0PZ")),Object(b.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," \u6846\u67b6\u5185\u6240\u6709\u62d3\u5c55\u7c7b\u547d\u540d\u7a7a\u95f4\uff0c\u5168\u90e8\u8fc1\u79fb\u5230 ",Object(b.b)("inlineCode",{parentName:"li"},"Furion.\u6a21\u5757.Extensions")," \u4e0b ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2AH54"},"#I2AH54")),Object(b.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Swagger")," \u8bb0\u4f4f\u6388\u6743\u5b58\u50a8\u65b9\u5f0f\uff0c\u66ff\u6362 ",Object(b.b)("inlineCode",{parentName:"li"},"Session")," \u5b58\u50a8\u65b9\u5f0f\u4e3a ",Object(b.b)("inlineCode",{parentName:"li"},"LocalStorage")," \u65b9\u5f0f ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2AKUA"},"#I2AKUA")),Object(b.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Furion")," \u6846\u67b6\u5305\u63cf\u8ff0\u6587\u4ef6\uff0c\u51cf\u5c11\u6846\u67b6\u4f53\u79ef ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2APAU"},"#I2APAU")),Object(b.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," ",Object(b.b)("inlineCode",{parentName:"li"},"App.CanBeScanTypes")," \u4e3a ",Object(b.b)("inlineCode",{parentName:"li"},"App.EffectiveTypes")," ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2B0ZR"},"#I2B0ZR")),Object(b.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," ",Object(b.b)("inlineCode",{parentName:"li"},"App.ServiceProvider")," \u5c5e\u6027\u5e76\u79fb\u9664 ",Object(b.b)("inlineCode",{parentName:"li"},"App.GetDuplicateXXX")," \u65b9\u6cd5 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2CYZE"},"#I2CYZE")),Object(b.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Db.GetDuplicateDbContext")," \u4e3a ",Object(b.b)("inlineCode",{parentName:"li"},"Db.GetNewDbContext")," ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2CZ04"},"#I2CZ04")),Object(b.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Db.GetSqlDispatchProxy")," \u4e3a ",Object(b.b)("inlineCode",{parentName:"li"},"Db.GetSqlProxy")," ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2DO9T"},"#I2DO9T")),Object(b.b)("li",{parentName:"ul"},"[\u91cd\u6784]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Aop")," \u670d\u52a1\u62e6\u622a\u5668\uff0c\u652f\u6301\u5f02\u6b65\u3001\u540c\u6b65\u4e24\u79cd\u65b9\u5f0f ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2B9HQ"},"#I2B9HQ")),Object(b.b)("li",{parentName:"ul"},"[\u91cd\u6784]"," \u7f51\u7edc\u8bf7\u6c42\u6240\u6709\u529f\u80fd ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2BMR7"},"#I2BMR7")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u95ee\u9898\u4fee\u590d")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Swagger")," \u89c4\u8303\u5316\u5316\u7ed3\u679c\u4e0d\u4e00\u81f4 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2ACF3"},"#I2ACF3")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u6570\u636e\u5e93\u65b0\u589e\u6216\u66f4\u65b0\u5ffd\u7565\u7a7a\u503c\u64cd\u4f5c\u65b9\u6cd5\u62a5\u7a7a\u5f02\u5e38 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2AB6C"},"#I2AB6C")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Startup.cs")," Aop \u5168\u5c40\u62e6\u622a\u65e0\u6548 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2A7T2"},"#I2A7T2")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Token")," \u8fc7\u671f\u540e\u81ea\u52a8\u5237\u65b0 ",Object(b.b)("inlineCode",{parentName:"li"},"Token")," \u65e0\u6cd5\u83b7\u53d6\u6700\u65b0\u7684\u7528\u6237\u4fe1\u606f bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2AWQI"},"#I2AWQI")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},'[ApiDescriptionSettings(Tag="xx")]')," \u5bfc\u81f4 ",Object(b.b)("inlineCode",{parentName:"li"},"swagger.json")," \u62a5\u9519 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2B47R"},"#I2B47R")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Mysql")," sql \u6570\u636e\u5e93\u67e5\u8be2\u7ed3\u679c ",Object(b.b)("inlineCode",{parentName:"li"},"tinyint")," \u7c7b\u578b\u8f6c\u6362\u51fa\u9519 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2BEBM"},"#I2BEBM")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u89c4\u8303\u5316\u7ed3\u679c\u591a\u6b21\u5305\u88f9\u7c7b\u578b bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2BHHZ"},"#I2BHHZ")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u52a8\u6001 Api \u57fa\u5143\u7c7b\u578b\u6570\u7ec4\u95ee\u9898 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2BMS5"},"#I2BMS5")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"sql")," \u67e5\u8be2\u679a\u4e3e\u7c7b\u578b\u8f6c\u6362\u5f02\u5e38 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2BS2Y"},"#I2BS2Y")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"string.SqlQuerizeAsync()")," \u62d3\u5c55\u8fd4\u56de\u9519\u8bef bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2BSTS"},"#I2BSTS")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u52a8\u6001 Api \u5b50\u7c7b\u91cd\u5199\u7236\u7c7b\u65b9\u6cd5\u5e76\u53d6\u522b\u540d\u540e ",Object(b.b)("inlineCode",{parentName:"li"},"Swagger")," \u5f02\u5e38 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2C9VP"},"#I2C9VP")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u7f51\u7edc\u8bf7\u6c42 ",Object(b.b)("inlineCode",{parentName:"li"},"application/json")," \u5e8f\u5217\u5316\u5927\u5c0f\u5199\u95ee\u9898 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2CRJC"},"#I2CRJC")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u591a\u6570\u636e\u5e93\u5b9a\u4f4d\u5668\u5b9e\u4f53\u5d4c\u5957\u5173\u8054 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2CVN0"},"#I2CVN0")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u8de8\u57df\u54cd\u5e94\u5934\u8bbe\u7f6e\u65e0\u6548 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2CW5T"},"#I2CW5T")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u8fdc\u7a0b\u7f51\u7edc\u8bf7\u6c42\u4ee3\u7406\u6253\u5370\u5230 ",Object(b.b)("inlineCode",{parentName:"li"},"MiniProfiler")," bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2CZBC"},"#I2CZBC")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u8fdc\u7a0b\u8bf7\u6c42\u54cd\u5e94\u62e6\u622a\u5668 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2D4DG"},"#I2D4DG")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"SqlSugar")," \u6846\u67b6 ",Object(b.b)("inlineCode",{parentName:"li"},"AsQueryable()")," \u4e00\u76f4\u8ffd\u52a0\u53c2\u6570 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2DH1D"},"#I2DH1D")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u81ea\u52a8\u5237\u65b0 ",Object(b.b)("inlineCode",{parentName:"li"},"Token")," \u7a7a\u5f02\u5e38 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2DO29"},"#I2DO29")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u751f\u6210 ",Object(b.b)("inlineCode",{parentName:"li"},"JWT Token")," \u4e0d\u4f20\u8fc7\u671f\u65f6\u95f4\u51fa\u73b0\u9a8c\u8bc1 401 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2DO8L"},"#I2DO8L")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"AppStartup")," \u6392\u5e8f\u65e0\u6548 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2DVD2"},"#I2DVD2")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u672a\u542f\u7528\u591a\u8bed\u8a00\u670d\u52a1\u65f6\u53cb\u597d\u5f02\u5e38\u548c\u9a8c\u8bc1\u51fa\u73b0\u7a7a\u5f02\u5e38 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2ECUJ"},"#I2ECUJ")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u6570\u636e\u6821\u9a8c\u5b57\u6bcd\u548c\u6570\u5b57\u7ec4\u5408\u65e0\u6cd5\u5339\u914d bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2EF2Q"},"#I2EF2Q")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u6570\u636e\u6821\u9a8c\u624b\u673a\u6216\u56fa\u8bdd\u65e0\u6548 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2M5IZ"},"#I2M5IZ")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Dapper")," \u62d3\u5c55\u89e3\u6790 ",Object(b.b)("inlineCode",{parentName:"li"},"SqlConnection")," \u5f02\u5e38 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2M5P2"},"#I2M5P2")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u5f00\u542f\u591a\u8bed\u8a00\u540e\uff0c",Object(b.b)("inlineCode",{parentName:"li"},"EF")," \u8fc1\u79fb\u5f02\u5e38 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2M7DT"},"#I2M7DT")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"IEntityTypeBuilder")," \u4e0d\u652f\u6301\u591a\u91cd\u7ee7\u627f bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2PAOD"},"#I2PAOD")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"JwtHandler")," \u8bbe\u7f6e\u81ea\u52a8\u5237\u65b0\u540e\uff0c\u533f\u540d\u8bbf\u95ee\u65e0\u6cd5\u901a\u8fc7 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2SDOX"},"#I2SDOX")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Dapper")," \u62d3\u5c55\u4e2d ",Object(b.b)("inlineCode",{parentName:"li"},"SqlServer")," \u6570\u636e\u5e93\u83b7\u53d6\u8fde\u63a5\u5bf9\u8c61\u7c7b\u578b bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/pulls/159"},"#PR159")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u5176\u4ed6\u66f4\u6539")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u4f18\u5316]"," \u79fb\u9664 ",Object(b.b)("inlineCode",{parentName:"li"},"Sql")," \u67e5\u8be2\u7ed3\u679c\u6620\u5c04\u68c0\u67e5 ",Object(b.b)("inlineCode",{parentName:"li"},"[NotMapper]")," \u7279\u6027\u673a\u5236 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I34XD0"},"#I34XD0")),Object(b.b)("li",{parentName:"ul"},"[\u4f18\u5316]"," \u4f9d\u8d56\u6ce8\u5165\u65f6\u6392\u9664 ",Object(b.b)("inlineCode",{parentName:"li"},"IDynamicApiController")," \u63a5\u53e3 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2ECTG"},"#I2ECTG")),Object(b.b)("li",{parentName:"ul"},"[\u4f18\u5316]"," ",Object(b.b)("inlineCode",{parentName:"li"},"MD5")," \u52a0\u5bc6\u6027\u80fd ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/pulls/158"},"#PR158")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u6587\u6863\u53d8\u5316")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u91cd\u6784]"," \u6587\u6863\u9996\u9875 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I34XBR"},"#I34XBR")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u7f51\u7edc\u8bf7\u6c42\u6587\u6863 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2APGJ"},"#I2APGJ")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u591a\u8bed\u8a00\u6587\u6863 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2DOCL"},"#I2DOCL")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u6587\u6863\u5168\u6587\u641c\u7d22\u5f15\u64ce ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I34XAW"},"#I34XAW")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u5168\u5c40\u9759\u6001\u7c7b\u7c7b\u578b ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I34XB4"},"#I34XB4")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u6846\u67b6\u53ef\u914d\u7f6e\u9009\u9879\u6587\u6863 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I34XB9"},"#I34XB9")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u4e8b\u4ef6\u603b\u7ebf\u6587\u6863 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I34XBI"},"#I34XBI")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u6570\u636e\u52a0\u89e3\u5bc6\u6587\u6863 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I34XC0"},"#I34XC0")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u8d21\u732e\u6307\u5357\u6587\u6863 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I34XC8"},"#I34XC8")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"HttpContext")," \u53ca ",Object(b.b)("inlineCode",{parentName:"li"},"\u6587\u4ef6\u4e0a\u4f20\u4e0b\u8f7d")," \u535a\u5ba2\u6587\u7ae0 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I34XCB"},"#I34XCB")),Object(b.b)("li",{parentName:"ul"},"[\u5176\u4ed6]"," \u6587\u6863\u5c0f\u8c03\u6574\uff0c\u5c0f\u4f18\u5316"))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u95ee\u7b54\u7b54\u7591")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u8de8\u57df\u8bbe\u7f6e\u65e0\u6548 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2ASNJ"},"#I2ASNJ")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(b.b)("inlineCode",{parentName:"li"},"MVC")," \u89c6\u56fe\u65e0\u6548\uff0c\u539f\u56e0\u662f ",Object(b.b)("inlineCode",{parentName:"li"},".cshtml")," \u6587\u4ef6\u6ca1\u6709\u8bbe\u7f6e\u4e3a ",Object(b.b)("inlineCode",{parentName:"li"},"\u5185\u5bb9")," ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2AXUU"},"#I2AXUU")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Sql")," \u64cd\u4f5c\u53ef\u4ee5\u5b9e\u73b0\u4e8b\u52a1\u5417\uff1f",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2B0NX"},"#I2B0NX")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(b.b)("inlineCode",{parentName:"li"},"IRepository")," \u64cd\u4f5c\u6570\u636e\u5e93\u4f1a\u6253\u5f00\u591a\u6b21\u6570\u636e\u5e93\u8fde\u63a5 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2BB7B"},"#I2BB7B")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u5982\u4f55\u8fdb\u5165\u81ea\u5b9a\u4e49 ",Object(b.b)("inlineCode",{parentName:"li"},"AppAuthorizeHandler")," \u65ad\u70b9 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2BGXY"},"#I2BGXY")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(b.b)("inlineCode",{parentName:"li"},"SqlSugar")," \u6ce8\u5165\u95ee\u9898 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2C2AQ"},"#I2C2AQ")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u5efa\u8bae\u589e\u52a0 API \u7b7e\u540d\u9a8c\u8bc1\uff0c\u65f6\u6548\u9a8c\u8bc1 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2C6ET"},"#I2C6ET")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u591a\u6570\u636e\u5e93\u591a\u79df\u6237\u540c\u65f6\u4f7f\u7528 ",Object(b.b)("inlineCode",{parentName:"li"},"Add-Migration")," \u62a5\u9519 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2CEHS"},"#I2CEHS")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(b.b)("inlineCode",{parentName:"li"},"ISqlSugarRepository")," \u6ca1\u6709 ",Object(b.b)("inlineCode",{parentName:"li"},"Getxxx")," \u65b9\u6cd5 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2CJLZ"},"#I2CJLZ")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(b.b)("inlineCode",{parentName:"li"},"cli.ps1")," \u5982\u4f55\u5c06 ",Object(b.b)("inlineCode",{parentName:"li"},"sql")," \u91cc\u7684\u8868\u5bfc\u51fa\u6210 ",Object(b.b)("inlineCode",{parentName:"li"},"model")," \u7c7b ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2CSUL"},"#I2CSUL")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u624b\u52a8\u4fee\u6539 ",Object(b.b)("inlineCode",{parentName:"li"},"Swagger")," \u7ec8\u7ed3\u70b9\u8def\u5f84\u65e0\u6548 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2D608"},"#I2D608")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(b.b)("inlineCode",{parentName:"li"},"DefaultDbContext")," \u4e0d\u80fd\u8bc6\u522b ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2DCZX"},"#I2DCZX")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u5404\u5206\u5c42\u9879\u76ee ",Object(b.b)("inlineCode",{parentName:"li"},"Startup.cs")," \u652f\u6301 ",Object(b.b)("inlineCode",{parentName:"li"},"Configuration")," ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2DDUP"},"#I2DDUP")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Aop")," \u65e0\u6cd5\u62e6\u622a\uff0c\u65e0\u6548 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2DEY8"},"#I2DEY8")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(b.b)("inlineCode",{parentName:"li"},"mysql")," \u6267\u884c ",Object(b.b)("inlineCode",{parentName:"li"},"Add-Migration")," \u62a5\u9519 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2DSB8"},"#I2DSB8"),"\\"),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Entity")," \u521b\u5efa\u65f6\u95f4\u548c\u662f\u5426\u5220\u9664\u6dfb\u52a0\u9ed8\u8ba4\u503c ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2E04H"},"#I2E04H")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(b.b)("inlineCode",{parentName:"li"},"swagger")," \u4e2d\u591a\u4e2a ",Object(b.b)("inlineCode",{parentName:"li"},"servers")," \u8bbe\u7f6e ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2E0IF"},"#I2E0IF")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u5168\u5c40\u7b5b\u9009\u5668 \u6ca1\u6709\u6267\u884c ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2E5R4"},"#I2E5R4")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u591a\u6570\u636e\u5e93\u5b9a\u4f4d\u5668\u7591\u95ee ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2E77T"},"#I2E77T")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(b.b)("inlineCode",{parentName:"li"},"cli.ps")," \u9006\u5411\u5de5\u7a0b ",Object(b.b)("inlineCode",{parentName:"li"},"Mysql")," \u6570\u636e\u5e93\u62a5\u9519 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2E7I5"},"#I2E7I5")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Swagger")," \u5f00\u53d1\u73af\u5883 ",Object(b.b)("inlineCode",{parentName:"li"},"applicationsettings.json")," \u4e2d\u6587\u4e71\u7801 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2EAG1"},"#I2EAG1")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u589e\u52a0\u6307\u5b9a\u8def\u5f84\u7a0b\u5e8f\u96c6\u6620\u5c04 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2EEO2"},"#I2EEO2")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u52a8\u6001\u7f16\u8bd1 ",Object(b.b)("inlineCode",{parentName:"li"},"cs")," \u811a\u672c\u6587\u4ef6 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2EH66"},"#I2EH66")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u81ea\u5b9a\u4e49\u4e2d\u95f4\u4ef6\uff0c\u8fd4\u56de\u7684\u9519\u8bef\u6ca1\u6709\u89c4\u8303\u5316\u7ed3\u679c ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2NV8S"},"#I2NV8S")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Swagger")," \u5faa\u73af\u5f15\u7528\u8bbe\u7f6e\u751f\u6210\u6587\u6863\u5c42\u7ea7\u65e0\u6548 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2PLQQ"},"#I2PLQQ")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u914d\u7f6e\u6587\u4ef6\u652f\u6301 ",Object(b.b)("inlineCode",{parentName:"li"},"yaml")," \u6587\u4ef6\u5417? ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2TJ3N"},"#I2TJ3N")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u4fee\u6539\u6570\u636e\u5e93\u672a ",Object(b.b)("inlineCode",{parentName:"li"},"mysql")," \u6267\u884c ",Object(b.b)("inlineCode",{parentName:"li"},"Add-Migration")," \u62a5\u9519 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2VR64"},"#I2VR64")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u591a\u6570\u636e\u5e93\u4f7f\u7528\u5b9a\u4f4d\u5668\u65f6\u62a5\u9519 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2VR8F"},"#I2VR8F")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Migration To Oracle")," \u5f02\u5e38 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2WBYQ"},"#I2WBYQ")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u5f00\u53d1\u65f6\u663e\u793a ",Object(b.b)("inlineCode",{parentName:"li"},"Swagger"),"\uff0c\u4e0a\u7ebf\u65f6\u5173\u95ed ",Object(b.b)("inlineCode",{parentName:"li"},"Swagger"),"\uff0c\u8fd9\u9700\u8981\u600e\u4e48\u914d\u7f6e ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2WOYV"},"#I2WOYV")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u517c\u5bb9 Mvc \u590d\u6742\u9a8c\u8bc1\u6ca1\u6709\u8bd5\u9a8c\u6210\u529f ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2X3GV"},"#I2X3GV")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Aop")," \u80fd\u4e0d\u80fd\u652f\u6301\u65e0\u63a5\u53e3\u7684\u7c7b ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2X8AS"},"#I2X8AS")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u5173\u4e8e ",Object(b.b)("inlineCode",{parentName:"li"},"JWT Token")," \u81ea\u52a8\u5237\u65b0\u95ee\u9898 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2YD4K"},"#I2YD4K")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u80fd\u5426\u589e\u52a0\u4e00\u4e2a\u62d3\u5c55\u7684 ",Object(b.b)("inlineCode",{parentName:"li"},"Entity"),"\uff0c\u589e\u52a0\u4e00\u4e9b\u62d3\u5c55\u7684\u5c5e\u6027 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2YDKT"},"#I2YDKT")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Furion")," \u65e0\u6cd5\u8fd8\u539f\u5305\uff0c\u4f7f\u7528",Object(b.b)("inlineCode",{parentName:"li"},"Nuget")," \u4e0b\u8f7d\u548c\u901a\u8fc7\u6700\u65b0\u7684\u7684\u811a\u624b\u67b6\u4e0b\u8f7d\u90fd\u63d0\u793a\u8fd9\u4e2a\u95ee\u9898 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I30446"},"#I30446")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u590d\u6742\u6821\u9a8c\u4e0e\u7279\u6027\u9a8c\u8bc1\u4e0d\u80fd\u5e76\u884c ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I3046U"},"#I3046U")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u4e0d\u505a\u5b9e\u73b0")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u5f15\u5165 Webhook \u673a\u5236 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2A3I0"},"#I2A3I0")),Object(b.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u589e\u52a0 blog \u5b58\u50a8\u670d\u52a1 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2AMBP"},"#I2AMBP")),Object(b.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," Blazor Server \u73af\u5883\u4e0b EF \u7684 DbContext \u591a\u7ebf\u7a0b\u95ee\u9898 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2AMD2"},"#I2AMD2")),Object(b.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u5e0c\u671b\u5b9e\u73b0\u5de5\u4f5c\u5355\u5143\u64cd\u4f5c\u63a5\u53e3\uff08IUnitOfWork\uff09",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2AOR5"},"#I2AOR5")),Object(b.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u5efa\u8bae\u65b0\u589e ",Object(b.b)("inlineCode",{parentName:"li"},"string.ToPagedListAsync()")," \u64cd\u4f5c ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2BZ3Z"},"#I2BZ3Z")),Object(b.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u5efa\u8bae\u65b0\u589e ",Object(b.b)("inlineCode",{parentName:"li"},"GraphQL"),"\uff0c",Object(b.b)("inlineCode",{parentName:"li"},"OData")," \u529f\u80fd ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2C9EH"},"#I2C9EH")),Object(b.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u8feb\u5207\u671f\u671b\u652f\u6301 CAP \u5206\u5e03\u5f0f\u4e8b\u52a1 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2CBRF"},"#I2CBRF")),Object(b.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u5982\u4f55\u8ba9\u67d0\u4e2a\u65b9\u6cd5\u6216\u5b9e\u4f53\u53d8\u5316\u540e\uff0c\u4e0d\u88ab ",Object(b.b)("inlineCode",{parentName:"li"},"SavingChangesEvent")," \u7b49\u62e6\u622a ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2CEM9"},"#I2CEM9")),Object(b.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u5efa\u8bae\u65e5\u5fd7\u5c01\u88c5\u589e\u52a0\u66f4\u591a\u62d3\u5c55\uff0c\u6bd4\u5982\uff1a\u81ea\u5b9a\u4e49\u4fdd\u5b58\u65e5\u5fd7\u6587\u4ef6 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2CW8V"},"#I2CW8V")),Object(b.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u5bf9 ",Object(b.b)("inlineCode",{parentName:"li"},"SqlSugar")," \u7684\u652f\u6301\uff0c\u589e\u52a0 ",Object(b.b)("inlineCode",{parentName:"li"},"Nuget")," \u811a\u624b\u67b6 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2D91U"},"#I2D91U")),Object(b.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u4f7f\u7528 ",Object(b.b)("inlineCode",{parentName:"li"},"Middleware")," \u5b9e\u73b0\u53cd\u5411\u4ee3\u7406 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2DKM1"},"#I2DKM1")),Object(b.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u652f\u6301\u914d\u7f6e\u591a\u4e2a ",Object(b.b)("inlineCode",{parentName:"li"},"Aop")," \u529f\u80fd ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2E6Z2"},"#I2E6Z2")),Object(b.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u662f\u5426\u8ba1\u5212\u5f00\u53d1\u7c7b\u4f3c\u7f51\u5173\u7684\u529f\u80fd ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2PD1L"},"#I2PD1L")),Object(b.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," ",Object(b.b)("inlineCode",{parentName:"li"},"waring CS8002"),": \u5f15\u7528\u7a0b\u5e8f\u96c6 ",Object(b.b)("inlineCode",{parentName:"li"},"Furion")," \u6ca1\u6709\u5f3a\u540d\u79f0 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2WDN2"},"#I2WDN2")),Object(b.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," Oracle \u6570\u636e\u5e93\u9a71\u52a8\u96c6\u6210 ",Object(b.b)("inlineCode",{parentName:"li"},"Devart.Data.Oracle.Entity.EFCore")," ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2XJIU"},"#I2XJIU"))))),Object(b.b)("hr",null),Object(b.b)("h2",{id:"v170\uff08\u5df2\u53d1\u5e03\uff09"},"v1.7.0\uff08\u5df2\u53d1\u5e03\uff09"),Object(b.b)("ul",null,Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u65b0\u7279\u6027")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Furion.Extras.ObjectMapper.Mapster")," \u62d3\u5c55\u5305 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29LSJ"},"#I29LSJ")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Furion.Extras.Logging.Serilog")," \u62d3\u5c55\u5305 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2AAN8"},"#I2AAN8")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Furion.Extras.Web.HttpContext")," \u62d3\u5c55\u5305 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29LSM"},"#I29LSM")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u5185\u7f6e ",Object(b.b)("inlineCode",{parentName:"li"},"Token")," \u5237\u65b0\u673a\u5236\u652f\u6301 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29K57"},"#I29K57")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u52a8\u6001\u6570\u636e\u5e93\u4e0a\u4e0b\u6587\uff0c\u652f\u6301\u8fd0\u884c\u65f6\u6267\u884c ",Object(b.b)("inlineCode",{parentName:"li"},"OnModelCreating")," ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I28UDT"},"#I28UDT")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u652f\u6301\u4f9d\u8d56\u6ce8\u5165\u6392\u9664\u6307\u5b9a\u63a5\u53e3 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29693"},"#I29693")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u89c4\u8303\u5316\u7ed3\u679c\u8fd4\u56de\u65f6\u95f4\u6233\u5b57\u6bb5 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29697"},"#I29697")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u57fa\u7840 ",Object(b.b)("inlineCode",{parentName:"li"},"CURD")," \u7236\u7c7b\u64cd\u4f5c\u4f8b\u5b50 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I296SR"},"#I296SR")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},'sql.Change("\u5b9a\u4f4d\u5668\u5b8c\u6574\u7c7b\u578b\u540d\u79f0")')," \u652f\u6301 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29LAB"},"#I29LAB")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"UpdateInclude")," \u548c ",Object(b.b)("inlineCode",{parentName:"li"},"UpdateExclude")," \u5ffd\u7565\u7a7a\u53c2\u6570\u652f\u6301 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29VUG"},"#I29VUG")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u6570\u636e\u5e93\u4e0a\u4e0b\u6587\u5185\u7f6e\u5047\u5220\u9664\u67e5\u8be2\u8fc7\u6ee4\u5668\u652f\u6301 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29Y2R"},"#I29Y2R")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u5ffd\u7565\u7a7a\u503c\u6392\u9664\u9ed8\u8ba4\u65f6\u95f4\u683c\u5f0f ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29VUV"},"#I29VUV")),Object(b.b)("li",{parentName:"ul"},"[\u5347\u7ea7]"," ",Object(b.b)("inlineCode",{parentName:"li"},"MiniProfiler")," \u7ec4\u4ef6 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I297R9"},"#I297R9")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u7a81\u7834\u6027\u53d8\u5316")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," ",Object(b.b)("inlineCode",{parentName:"li"},"AppAuthorizeHandler")," \u6388\u6743\u7ba1\u9053\u4e3a\u5f02\u6b65\u5904\u7406 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29MD9"},"#I29MD9")),Object(b.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Swagger")," \u9ed8\u8ba4\u542f\u7528 ",Object(b.b)("inlineCode",{parentName:"li"},"JWT")," \u6388\u6743\u652f\u6301 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29LI4"},"#I29LI4")),Object(b.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," ",Object(b.b)("inlineCode",{parentName:"li"},"HttpContextUtilities")," \u540d\u79f0\u6539\u4e3a ",Object(b.b)("inlineCode",{parentName:"li"},"HttpContextLocal")," ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29KQE"},"#I29KQE")),Object(b.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," ",Object(b.b)("inlineCode",{parentName:"li"},"UnifyResultContext")," \u540d\u79f0\u6539\u4e3a ",Object(b.b)("inlineCode",{parentName:"li"},"UnifyContext")," ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29LLZ"},"#I29LLZ")),Object(b.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," \u53ea\u6709\u6267\u884c\u8fc1\u79fb\u547d\u4ee4\u624d\u626b\u63cf\u79cd\u5b50\u6570\u636e ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29E6P"},"#I29E6P")),Object(b.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," \u89c4\u8303\u5316\u7ed3\u679c ",Object(b.b)("inlineCode",{parentName:"li"},"Successed")," \u5c5e\u6027\u540d\u4e3a ",Object(b.b)("inlineCode",{parentName:"li"},"Succeeded")," ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29NMV"},"#I29NMV")),Object(b.b)("li",{parentName:"ul"},"[\u79fb\u9664]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Mapster")," \u5bf9\u8c61\u7ec4\u4ef6\uff0c\u91c7\u7528\u63d0\u4f9b\u62d3\u5c55\u65b9\u5f0f ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29D2M"},"#I29D2M")),Object(b.b)("li",{parentName:"ul"},"[\u79fb\u9664]"," ",Object(b.b)("inlineCode",{parentName:"li"},"CacheManager")," \u62d3\u5c55\u7c7b ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29LU1"},"#I29LU1")),Object(b.b)("li",{parentName:"ul"},"[\u91cd\u6784]"," ",Object(b.b)("inlineCode",{parentName:"li"},"SaveChanges")," \u62e6\u622a\u5668 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I292LO"},"#I292LO")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u95ee\u9898\u4fee\u590d")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u672a\u6ce8\u518c\u7684\u6570\u636e\u5e93\u4e0a\u4e0b\u6587\u4e5f\u88ab\u5f15\u7528\u5168\u5c40\u67e5\u8be2\u62e6\u622a\u5668 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29ZXJ"},"#I29ZXJ")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u624b\u52a8\u8fd4\u56de ",Object(b.b)("inlineCode",{parentName:"li"},"BadObjectResult")," \u6216 ",Object(b.b)("inlineCode",{parentName:"li"},"ValidationProblemDetails")," \u7ed3\u679c\u7c7b\u578b\u65f6\u89c4\u8303\u5316\u7ed3\u679c\u5931\u6548 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29ZU9"},"#I29ZU9")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u52a8\u6001 WebApi ",Object(b.b)("inlineCode",{parentName:"li"},"KeepName"),"\uff0c",Object(b.b)("inlineCode",{parentName:"li"},"KeepVerb"),"\u3001",Object(b.b)("inlineCode",{parentName:"li"},"SplitCamelCase")," \u65e0\u6548 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29X90"},"#I29X90")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Sql\u4ee3\u7406")," \u8fd4\u56de ",Object(b.b)("inlineCode",{parentName:"li"},"\u5143\u7ec4")," \u7c7b\u578b\u51fa\u9519 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29SMV"},"#I29SMV")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"401\uff0c403")," \u72b6\u6001\u7801\u89c4\u8303\u5316\u8fd4\u56de\u503c\u5c5e\u6027\u53d8\u5927\u5199 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29M8Y"},"#I29M8Y")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"HttpContext")," \u7a7a\u5f02\u5e38 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29LU4"},"#I29LU4")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u63a5\u53e3\u65e0\u8fd4\u56de\u503c\u6ca1\u6709\u5e94\u7528\u89c4\u8303\u5316\u7ed3\u679c bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29GT7"},"#I29GT7")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u524d\u7aef ",Object(b.b)("inlineCode",{parentName:"li"},"Less")," \u914d\u7f6e\u6587\u4ef6\u5bfc\u81f4\u4e3b\u673a\u542f\u52a8\u5931\u8d25 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29E7P"},"#I29E7P")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u6267\u884c ",Object(b.b)("inlineCode",{parentName:"li"},"sql")," \u7ed3\u679c\u8f6c\u6cdb\u578b\u540e\u5c5e\u6027\u91cd\u590d\u8d4b\u503c bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29BUO"},"#I29BUO")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Swagger")," \u5173\u95ed ",Object(b.b)("inlineCode",{parentName:"li"},"MiniProfiler")," \u4e4b\u540e ",Object(b.b)("inlineCode",{parentName:"li"},"\u7ec4\u4e2d\u7ec4")," \u5931\u6548 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29789"},"#I29789")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u672a\u542f\u7528\u89c4\u8303\u5316\u7ed3\u679c\u65f6\u5f02\u5e38\u8fd4\u56de ",Object(b.b)("inlineCode",{parentName:"li"},"System.Object")," \u5b57\u7b26 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2969A"},"#I2969A")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u6b63\u6570\u6570\u636e\u9a8c\u8bc1 0 \u4e5f\u9a8c\u8bc1\u901a\u8fc7 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2955T"},"#I2955T")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u975e\u6cdb\u578b\u7c7b\u96c6\u6210\u6cdb\u578b\u63a5\u53e3\u4f9d\u8d56\u6ce8\u5165 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I294YT"},"#I294YT")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Swagger")," \u4e0d\u652f\u6301 ",Object(b.b)("inlineCode",{parentName:"li"},"new")," \u8986\u76d6\u7236\u7c7b\u7684 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I28Z1A"},"#I28Z1A")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"JsonSerializerUtility")," \u6ca1\u6709\u516c\u5f00 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I28WMI"},"#I28WMI")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"SqlSugar")," \u62d3\u5c55\u67e5\u8be2\u6cdb\u578b\u7c7b\u578b\u6ce8\u518c\u5f02\u5e38 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I28VMT"},"#I28VMT")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Furion Tools")," \u4e0d\u652f\u6301\u751f\u6210\u4e0d\u540c\u547d\u540d\u7a7a\u95f4\u7684\u5b9e\u4f53 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2A175"},"#I2A175")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u5168\u5c40\u62e6\u622a\u5668\u65e0\u6548 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2A7T2"},"#I2A7T2")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u65b0\u589e\u6216\u66f4\u65b0\u5ffd\u7565\u7a7a\u503c\u7a7a\u5f02\u5e38 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2AB6C"},"#I2AB6C")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u5176\u4ed6\u66f4\u6539")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u4f18\u5316]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Token")," \u751f\u6210\u52a0\u5bc6\u7b97\u6cd5 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29KIH"},"#I29KIH")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u6587\u6863\u53d8\u5316")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u65e5\u5fd7\u6587\u6863 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I28Y9D"},"#I28Y9D")),Object(b.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," \u6570\u636e\u5e93\u4e0a\u4e0b\u6587\u3001\u5b9e\u4f53\u62e6\u622a\u5668\u3001\u914d\u7f6e\u3001\u4e00\u5206\u949f\u5165\u95e8\u7b49\u7b49\u6587\u6863"))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u95ee\u7b54\u7b54\u7591")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u95ee\u7b54]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Swagger")," \u5982\u4f55\u5b9e\u73b0\u6388\u6743\u8bbf\u95ee ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I294F2"},"#I294F2")),Object(b.b)("li",{parentName:"ul"},"[\u95ee\u7b54]"," \u5982\u4f55\u5b9e\u73b0\u591a\u4e2a\u6570\u636e\u5e93\u591a\u5bf9\u591a\u5b9e\u4f53\u914d\u7f6e ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29G6S"},"#I29G6S")),Object(b.b)("li",{parentName:"ul"},"[\u95ee\u7b54]"," \u52a8\u6001 WebApi \u652f\u6301\u6587\u4ef6\u4e0a\u4f20\u5417 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29R5E"},"#I29R5E")),Object(b.b)("li",{parentName:"ul"},"[\u7591\u95ee]"," \u591a\u4e2a\u6570\u636e\u5e93\u4e0a\u4e0b\u6587\u65e0\u6cd5\u751f\u6210\u8fc1\u79fb\u4ee3\u7801 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2A6II"},"#I2A6II")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u4e0d\u505a\u5b9e\u73b0")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u5b9e\u73b0 ",Object(b.b)("inlineCode",{parentName:"li"},"BuildChange")," \u4f20\u5165\u8868\u540d ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I292SN"},"#I292SN")),Object(b.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u6267\u884c\u6570\u636e\u5e93\u64cd\u4f5c\u7ed3\u679c\u4e0d\u652f\u6301\u5c5e\u6027\u5ffd\u7565\u5927\u5c0f\u5199\u8d4b\u503c ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29DRQ"},"#I29DRQ")),Object(b.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u5f15\u5165 ",Object(b.b)("inlineCode",{parentName:"li"},"Webhook")," \u673a\u5236 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2A3I0"},"#I2A3I0"))))),Object(b.b)("hr",null),Object(b.b)("h2",{id:"v140\uff08\u5df2\u53d1\u5e03\uff09"},"v1.4.0\uff08\u5df2\u53d1\u5e03\uff09"),Object(b.b)("ul",null,Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u65b0\u7279\u6027")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Furion")," \u652f\u6301\u4e8c\u7ea7\u865a\u62df\u76ee\u5f55\u90e8\u7f72\u529f\u80fd ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I28B77"},"#I28B77")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Furion.Template.RazorWithWebApi")," \u811a\u624b\u67b6 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I28QGI"},"#I28QGI")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Furion.Template.BlazorWithWebApi")," \u811a\u624b\u67b6 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I27Z3O"},"#I27Z3O")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"EFCore")," \u65f6\u6001\u67e5\u8be2\u62d3\u5c55 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I28AJ6"},"#I28AJ")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"[AppDbContext(\u8fde\u63a5\u5b57\u7b26\u4e32\uff0c\u6570\u636e\u5e93\u7c7b\u578b)]")," \u914d\u7f6e\u652f\u6301 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I28QTB"},"#I28QTB")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"DateTimeOffset")," \u8f6c ",Object(b.b)("inlineCode",{parentName:"li"},"DateTime")," \u62d3\u5c55\u65b9\u6cd5 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I27MQA"},"#I27MQA")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"ValidationTypes")," \u9a8c\u8bc1\u6b63\u5219\u8868\u8fbe\u5f0f\u667a\u80fd\u63d0\u793a ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2801V"},"#I2801V")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"ValiationTypes.WordWithNumber")," \u9a8c\u8bc1 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2805A"},"#I2805")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u83b7\u53d6\u5ba2\u6237\u7aef\u548c\u670d\u52a1\u7aef IP \u5730\u5740 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I28QV9"},"#I28QV9")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u7a81\u7834\u6027\u53d8\u5316")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u5347\u7ea7]"," .NET 5.0 \u7248\u672c\u81f3 .NET 5.0.1 \u7248\u672c ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I28QU1"},"#I28QU")),Object(b.b)("li",{parentName:"ul"},"[\u91cd\u6784]"," \u89c6\u56fe\u5f15\u64ce\u529f\u80fd\uff0c\u4f18\u5316\u4e0d\u89c4\u8303\u547d\u540d\u548c\u65b0\u589e\u5b57\u7b26\u4e32\u6a21\u677f\u7f16\u8bd1 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I28G0S"},"#I28G0S")),Object(b.b)("li",{parentName:"ul"},"[\u91cd\u6784]"," \u6570\u636e\u5e93\u5b9e\u4f53\u67e5\u627e\u7b97\u6cd5\uff0c\u5e76\u4f18\u5316\u6027\u80fd ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I28QUQ"},"#I28QUQ")),Object(b.b)("li",{parentName:"ul"},"[\u4f18\u5316]"," \u5e94\u7528\u542f\u52a8\u521d\u59cb\u5316\u6027\u80fd\u548c\u6570\u636e\u5e93\u7b2c\u4e00\u6b21\u81ea\u52a8\u914d\u7f6e ",Object(b.b)("inlineCode",{parentName:"li"},"DbSet")," \u6027\u80fd"))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u95ee\u9898\u4fee\u590d")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u591a\u6570\u636e\u5e93\u4e0a\u4e0b\u6587\u914d\u7f6e\u5b9a\u4f4d\u5668\u540e\u5b9e\u4f53\u65e0\u6cd5\u6b63\u786e\u751f\u6210 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2888L"},"#I2888L")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u591a\u79df\u6237\u6570\u636e\u5e93\u4e0a\u4e0b\u6587\u5b9e\u4f53\u751f\u6210 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2891G"},"#I2891G")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u5bf9\u8c61\u9a8c\u8bc1\u5931\u8d25\u63d0\u793a\u6d88\u606f\u6ca1\u6709\u5e94\u7528 ",Object(b.b)("inlineCode",{parentName:"li"},"JSON")," \u5927\u5c0f\u5199\u914d\u7f6e bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I27UTX"},"#I27UTX")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u4ed3\u50a8 ",Object(b.b)("inlineCode",{parentName:"li"},"Insert")," \u6216 ",Object(b.b)("inlineCode",{parentName:"li"},"Update")," \u65b9\u6cd5\u6307\u5b9a ",Object(b.b)("inlineCode",{parentName:"li"},"ignoreNullValues")," \u65e0\u6548 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I27UN6"},"#I27UN6")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Controller")," \u6d3e\u751f\u7c7b\u5982\u679c\u8d34\u4e86 ",Object(b.b)("inlineCode",{parentName:"li"},"[Route]")," \u7279\u6027\u540e\u51fa\u73b0\u5728 ",Object(b.b)("inlineCode",{parentName:"li"},"Swagger")," \u4e2d bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I27TN7"},"#I27TN7")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"SqlScalar")," \u6267\u884c ",Object(b.b)("inlineCode",{parentName:"li"},"sql")," \u8fd4\u56de ",Object(b.b)("inlineCode",{parentName:"li"},"Nullable")," \u7c7b\u578b\u51fa\u73b0\u8f6c\u6362\u5931\u8d25 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I27S2N"},"#I27S2N")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"[UnitOfWork]")," \u7279\u6027\u5f02\u5e38 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I27MLM"},"#I27MLM")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"sql")," \u9759\u6001\u6267\u884c\u65b9\u5f0f\u548c ",Object(b.b)("inlineCode",{parentName:"li"},"sql")," \u9ad8\u7ea7\u4ee3\u7406\u65e0\u6cd5\u76d1\u542c\u6570\u636e\u5e93\u8fde\u63a5\u72b6\u6001 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I27M4F"},"#I27M4F")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u4fee\u590d\u66f4\u6362 Json \u5e8f\u5217\u5316\u5e93\u65e0\u6548 bug\uff0c\u5982\u66ff\u6362\u4e3a ",Object(b.b)("inlineCode",{parentName:"li"},"Microsoft.AspNetCore.Mvc.NewtonsoftJson")," ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I27M43"},"#I27M43")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Furion Tools")," \u5de5\u5177\u751f\u6210\u6a21\u578b bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I27XI5"},"#I27XI5")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u8f6f\u5220\u9664\u6ca1\u6709\u751f\u6548 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2804I"},"#I2804I")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Furion Tools")," \u8bc6\u522b\u5e26\u591a\u4e2a ",Object(b.b)("inlineCode",{parentName:"li"},"\\\\")," \u7684\u8fde\u63a5\u5b57\u7b26\u4e32\u8bc6\u522b bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I280TS"},"#I280TS"),"\uff0c",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/pulls/91"},"#PR91")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Furion Tools")," \u65e0\u6cd5\u53d6\u6d88\u751f\u6210 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2816M"},"#I2816M")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"DateTimeOffset")," \u8f6c\u672c\u5730\u65f6\u95f4\u5dee 8 \u5c0f\u65f6 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I28BA9"},"#I28BA9")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u542f\u7528 ",Object(b.b)("inlineCode",{parentName:"li"},"bundle js&css")," \u538b\u7f29\u540e\u542f\u52a8\u5f02\u5e38 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I28KRP"},"#I28KR")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"ValidationTypes.Required")," \u65e0\u6548 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/pulls/98"},"#PR98")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u89c4\u8303\u5316\u7ed3\u679c",Object(b.b)("inlineCode",{parentName:"li"},"OnValidateFailed")," \u53c2\u6570\u540d\u62fc\u5199\u9519\u8bef bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/pulls/93"},"#PR93"),"\uff0c",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/pulls/92"},"#PR92")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u6388\u6743\u7ba1\u9053\u9a8c\u8bc1\u5931\u8d25\u8fd8\u663e\u793a\u7ed3\u679c bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/pulls/89"},"#PR89")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u5176\u4ed6\u66f4\u6539")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u66f4\u65b0]"," README.md \u53cb\u60c5\u8fde\u63a5\u5730\u5740 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/pulls/88"},"#PR88")),Object(b.b)("li",{parentName:"ul"},"[\u66f4\u65b0]"," \u6a21\u677f\u811a\u624b\u67b6\u6e90\u7801\uff0c\u6dfb\u52a0 ",Object(b.b)("inlineCode",{parentName:"li"},"EFCore Tools")," \u5e93 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/pulls/87"},"#PR87")),Object(b.b)("li",{parentName:"ul"},"[\u66f4\u65b0]"," README.md Nuget \u56fe\u6807 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/pulls/85"},"#PR85")),Object(b.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u5c06 ",Object(b.b)("inlineCode",{parentName:"li"},"List")," \u8f6c ",Object(b.b)("inlineCode",{parentName:"li"},"DateTable")," ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/pulls/97"},"#PR97")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u6587\u6863\u53d8\u5316")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u89c6\u56fe\u5f15\u64ce\u6a21\u677f\u6587\u6863 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I27ZVA"},"#I27ZVA")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"EFCore")," \u65f6\u6001\u67e5\u8be2\u6587\u6863 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I28AJ6"},"#I28AJ"),", ",Object(b.b)("a",{parentName:"li",href:"https://dotnetchina.gitee.io/furion/docs/dbcontext-hight-query/#91111-%E6%97%B6%E6%80%81%E6%9F%A5%E8%AF%A2"},"DOC")),Object(b.b)("li",{parentName:"ul"},"[\u66f4\u65b0]"," \u4ed3\u50a8\u6587\u6863\u4e66\u5199\u7eb0\u6f0f bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/pulls/90"},"#PR90")),Object(b.b)("li",{parentName:"ul"},"[\u66f4\u65b0]"," \u9009\u9879\u6587\u6863\u9519\u8bef bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/pulls/86"},"#PR86")),Object(b.b)("li",{parentName:"ul"},"[\u66f4\u65b0]"," ",Object(b.b)("inlineCode",{parentName:"li"},"\u5b9e\u4f53\u6570\u636e\u76d1\u542c\u5668")," \u6587\u6863\u4e66\u5199\u9519\u8bef bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/pulls/83/files"},"#PR83")),Object(b.b)("li",{parentName:"ul"},"[\u66f4\u65b0]"," \u6570\u636e\u5e93\u4e0a\u4e0b\u6587\u3001\u591a\u6570\u636e\u5e93\u3001\u811a\u624b\u67b6\u7b49\u6587\u6863"))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u95ee\u7b54\u7b54\u7591")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u5efa\u8bae]"," \u5e0c\u671b ",Object(b.b)("inlineCode",{parentName:"li"},"api")," \u8fd4\u56de\u7684\u503c\u81ea\u52a8\u5c06 null \u8f6c\u4e3a '' \u6216 ","[][#I286IJ]","(",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I286IJ)%EF%BC%8C%E3%80%90%E5%B7%B2%E5%85%B3%E9%97%AD%E3%80%91"},"https://gitee.com/dotnetchina/Furion/issues/I286IJ)\uff0c\u3010\u5df2\u5173\u95ed\u3011")),Object(b.b)("li",{parentName:"ul"},"[\u5efa\u8bae]"," \u6dfb\u52a0\u7f51\u5173\u529f\u80fd ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I27TP7"},"#I27TP7"),"\uff0c\u3010\u5df2\u5173\u95ed\u3011"),Object(b.b)("li",{parentName:"ul"},"[\u5efa\u8bae]"," \u65b0\u589e ",Object(b.b)("inlineCode",{parentName:"li"},"SqlQuery")," \u83b7\u53d6\u5355\u6761\u8bb0\u5f55\u65b9\u6cd5 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I28M1V"},"#I28M1V"),"\uff0c\u3010\u5df2\u5173\u95ed\u3011"),Object(b.b)("li",{parentName:"ul"},"[\u5efa\u8bae]"," \u5e0c\u671b\u53ef\u4ee5\u63d0\u4f9b\u96c6\u6210 ",Object(b.b)("inlineCode",{parentName:"li"},"Serilog")," \u4f8b\u5b50 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I282J4"},"#I282J4"),"\uff0c\u3010\u5df2\u5173\u95ed\u3011"),Object(b.b)("li",{parentName:"ul"},"[\u7591\u95ee]"," \u5982\u4f55\u901a\u8fc7\u7279\u6027\u914d\u7f6e\u552f\u4e00\u7ea6\u675f ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2891L"},"#I2891L"),"\uff0c\u3010\u5df2\u5173\u95ed\u3011"),Object(b.b)("li",{parentName:"ul"},"[\u7591\u95ee]"," \u600e\u4e48\u8bfb\u53d6 ",Object(b.b)("inlineCode",{parentName:"li"},"appsettings.json")," \u6570\u7ec4 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I27WUR"},"#I27WU"),"\uff0c\u3010\u5df2\u5173\u95ed\u3011"),Object(b.b)("li",{parentName:"ul"},"[\u7591\u95ee]"," ",Object(b.b)("inlineCode",{parentName:"li"},"IRepository")," \u51fa\u73b0\u7a7a\u5f02\u5e38 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I281IE"},"#I281IE"),"\uff0c\u3010\u5df2\u5173\u95ed\u3011"),Object(b.b)("li",{parentName:"ul"},"[\u7591\u95ee]"," \u89c4\u8303\u5316\u63a5\u53e3\u95ee\u9898\u95ee\u9898 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I28NMZ"},"#I28NMZ"),"\uff0c\u3010\u5df2\u5173\u95ed\u3011"),Object(b.b)("li",{parentName:"ul"},"[\u7591\u95ee]"," \u7edf\u4e00\u8fd4\u56de\u503c\u6a21\u578b\u4e2d OnResponseStatusCodes \u672a\u6267\u884c ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I28NNL"},"#I28NNL"),"\uff0c\u3010\u5df2\u5173\u95ed\u3011")))),Object(b.b)("hr",null),Object(b.b)("h2",{id:"v120\uff08\u5df2\u53d1\u5e03\uff09"},"v1.2.0\uff08\u5df2\u53d1\u5e03\uff09"),Object(b.b)("ul",null,Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u65b0\u7279\u6027")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u96ea\u82b1\u7b97\u6cd5 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I26OXG"},"#I26OXG"),", ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/pulls/78"},"#PR78")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"[AppDbContext]")," \u914d\u7f6e\u6570\u636e\u5e93\u63d0\u4f9b\u5668\u652f\u6301 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I27G3T"},"#I27G3T")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u5b9e\u4f53\u8868\u6570\u636e\u66f4\u6539\u76d1\u542c\u63a5\u53e3 ",Object(b.b)("inlineCode",{parentName:"li"},"IEntityDataChangedListener")," ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I278DD"},"#I278DD"),", ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I278LQ"},"#I278LQ")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u5168\u5c40\u670d\u52a1\u63a5\u53e3 AOP \u62e6\u622a\u529f\u80fd ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I278CP"},"#I278CP")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u5b9a\u4f4d\u5668\u4ed3\u50a8 ",Object(b.b)("inlineCode",{parentName:"li"},"IDbRepository")," ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I276Q3"},"#I276Q3")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u6570\u636e\u5e93\u64cd\u4f5c ",Object(b.b)("inlineCode",{parentName:"li"},"InsertOrUpdate")," \u652f\u6301\u6392\u9664\u7a7a\u5b57\u7b26\u4e32\u529f\u80fd ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I272OG"},"#I272OG")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u6570\u636e\u5e93\u64cd\u4f5c ",Object(b.b)("inlineCode",{parentName:"li"},"UpdateInclude")," \u548c ",Object(b.b)("inlineCode",{parentName:"li"},"UpdateExclude")," \u533f\u540d\u5bf9\u8c61\u652f\u6301 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I271X0"},"#I271X0")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u6570\u636e\u9a8c\u8bc1\u4f20\u5165\u7a7a\u5bf9\u8c61\u8df3\u8fc7\u9a8c\u8bc1\u652f\u6301 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I273R4"},"#I273R4")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u5e94\u7528\u542f\u52a8\u65f6\u652f\u6301\u6392\u9664\u7279\u5b9a\u914d\u7f6e\u6587\u4ef6\u81ea\u52a8\u52a0\u8f7d ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I26U0A"},"#I26U0A")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u5355\u4e2a\u5b9e\u4f53\u8868\u540d\u524d\u7f00\u652f\u6301 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I26LX0"},"#I26LX0")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"MySql")," \u6570\u636e\u5e93\u81ea\u52a8\u914d\u7f6e\u9ed8\u8ba4\u7248\u672c\u53f7 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I26XQ6"},"#I26XQ6")),Object(b.b)("li",{parentName:"ul"},"[\u4f18\u5316]"," \u6388\u6743\u5904\u7406\u7a0b\u5e8f\u4ee3\u7801"))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u7a81\u7834\u6027\u53d8\u5316")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u5b9e\u4f53\u8868\u6570\u636e\u66f4\u6539\u76d1\u542c\u63a5\u53e3 ",Object(b.b)("inlineCode",{parentName:"li"},"IEntityDataChangedListener")," ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I278DD"},"#I278DD"),", ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I278LQ"},"#I278LQ")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u5168\u5c40\u670d\u52a1\u63a5\u53e3 AOP \u62e6\u622a\u529f\u80fd ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I278CP"},"#I278CP")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u96ea\u82b1\u7b97\u6cd5 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I26OXG"},"#I26OXG"),", ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/pulls/78"},"#PR78")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u95ee\u9898\u4fee\u590d")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u89c6\u56fe\u5f15\u64ce\u52a0\u8f7d\u5916\u90e8\u7a0b\u5e8f\u96c6\u51fa\u9519 bug"),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u4f9d\u8d56\u6ce8\u5165\u4ee3\u7406\u63a5\u53e3\u62a5\u7a7a\u5bf9\u8c61\u5f02\u5e38 bug"),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"EFCore")," \u53d6\u6d88\u9644\u52a0\u5b9e\u4f53\u51fa\u9519 bug"),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u6570\u636e\u5e93\u4ed3\u50a8\u5728\u975e Web \u8bf7\u6c42\u4e0b\u51fa\u73b0\u7a7a\u5f02\u5e38 bug"),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u591a\u4e2a\u6388\u6743\u7b56\u7565\u5171\u5b58\u95ee\u9898\u51fa\u73b0\u65e0\u6548 bug"),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u53cb\u597d\u5f02\u5e38 ",Object(b.b)("inlineCode",{parentName:"li"},"Oop.Oh")," \u4e0d\u652f\u6301\u666e\u901a\u65b9\u6cd5 bug"),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u83b7\u53d6\u591a\u79df\u6237\u5bf9\u8c61\u65f6\u6570\u636e\u5e93\u4e0a\u4e0b\u6587\u51fa\u73b0\u4f5c\u7528\u57df\u9a8c\u8bc1\u5931\u8d25 bug"),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u5de5\u4f5c\u5355\u5143\u4e0d\u652f\u6301 ",Object(b.b)("inlineCode",{parentName:"li"},"Sql\u4ee3\u7406")," \u62e6\u622a bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I27GST"},"#I27GST")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u5176\u4ed6\u66f4\u6539")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u5173\u95ed][#I26O1F]","(",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I26O1F"},"https://gitee.com/dotnetchina/Furion/issues/I26O1F"),"), ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I27B2I"},"#I27B2I"),", ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I27BJ6"},"#I27BJ6"),", ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I27E5Z"},"#I27E5Z"),", ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I27EL4"},"#I27EL4")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u6587\u6863\u53d8\u5316")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e][\u5b9e\u4f53\u6570\u636e\u76d1\u542c\u5668]","(",Object(b.b)("a",{parentName:"li",href:"https://dotnetchina.gitee.io/furion/docs/dbcontext-entitytrigger"},"https://dotnetchina.gitee.io/furion/docs/dbcontext-entitytrigger"),") \u6587\u6863"),Object(b.b)("li",{parentName:"ul"},"[\u66f4\u65b0]"," \u4e00\u5206\u949f\u5165\u95e8\u3001\u5e94\u7528\u542f\u52a8\u3001\u5b98\u65b9\u811a\u624b\u67b6\u3001\u6570\u636e\u5e93\u64cd\u4f5c\u6307\u5357\u3001\u5bf9\u8c61\u6620\u5c04\u3001\u89c4\u8303\u5316\u6587\u6863\u3001\u5f02\u5e38\u5904\u7406\u3001\u9274\u6743\u6388\u6743\u6587\u6863")))),Object(b.b)("hr",null),Object(b.b)("h2",{id:"v110\uff08\u5df2\u53d1\u5e03\uff09"},"v1.1.0\uff08\u5df2\u53d1\u5e03\uff09"),Object(b.b)("ul",null,Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u65b0\u7279\u6027")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Db.GetDbContext()")," \u83b7\u53d6\u9ed8\u8ba4\u6570\u636e\u5e93\u4e0a\u4e0b\u6587\u65b9\u6cd5"),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"HttpContextUtility.GetCurrentHttpContext()")," \u83b7\u53d6\u5168\u5c40 ",Object(b.b)("inlineCode",{parentName:"li"},"HttpContext")," \u4e0a\u4e0b\u6587"),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"App.GetRequiredService<>")," \u89e3\u6790\u670d\u52a1\u65b9\u6cd5"),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"object.GetService<>")," \u5bf9\u8c61\u62d3\u5c55\u65b9\u6cd5"),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u7b56\u7565\u6388\u6743 ",Object(b.b)("inlineCode",{parentName:"li"},"PolicyPipeline")," \u57fa\u7c7b\u65b9\u6cd5\uff0c\u652f\u6301\u591a\u91cd\u5224\u65ad\u6388\u6743"),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"JWTEncryption.ValidateJwtBearerToken")," \u624b\u52a8\u9a8c\u8bc1\u9759\u6001\u65b9\u6cd5"),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u5168\u5c40\u6570\u636e\u5e93\u4e0a\u4e0b\u6587 ",Object(b.b)("inlineCode",{parentName:"li"},"InsertOrUpdateIgnoreNullValues")," \u548c ",Object(b.b)("inlineCode",{parentName:"li"},"EnabledEntityStateTracked")," \u5168\u5c40\u914d\u7f6e"),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Swagger Jwt\u6388\u6743")," \u5168\u5c40\u6388\u6743\u53c2\u6570 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I26GLR"},"#I26GLR")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"InsertOrUpdate")," \u652f\u6301\u81ea\u5b9a\u4e49\u5224\u65ad\u6761\u4ef6\u529f\u80fd ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I269Q1"},"#I269Q1")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u5b57\u7b26\u4e32\u5b57\u6bb5\u5c0f\u5199\u547d\u540d\u652f\u6301 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2695D"},"#I2695D")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u5b57\u7b26\u4e32\u6587\u672c\u5bf9\u6bd4\u529f\u80fd ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I268LE"},"#I268LE")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u5168\u5c40\u5f02\u5e38\u7279\u6027\u6d88\u606f\u529f\u80fd ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2662O"},"#I2662O")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Insert")," \u6216 ",Object(b.b)("inlineCode",{parentName:"li"},"Update")," \u6570\u636e\u5e93\u5ffd\u7565\u7a7a\u503c\u529f\u80fd ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I264Q4"},"#I264Q4")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u7a81\u7834\u6027\u53d8\u5316")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Fur")," \u9879\u76ee\u540d\u4e3a ",Object(b.b)("inlineCode",{parentName:"li"},"Furion")),Object(b.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Db.GetRequestDbContext<>()")," \u547d\u540d\u4e3a ",Object(b.b)("inlineCode",{parentName:"li"},"Db.GetDbContext<>()")),Object(b.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Db.GetDbContext<>()")," \u547d\u540d\u4e3a ",Object(b.b)("inlineCode",{parentName:"li"},"Db.GetDuplicateDbContext<>()")),Object(b.b)("li",{parentName:"ul"},"[\u91cd\u6784]"," ",Object(b.b)("inlineCode",{parentName:"li"},"App.GetService<>")," \u89e3\u6790\u670d\u52a1\u7684\u5e95\u5c42\u903b\u8f91\uff0c\u5927\u5927\u63d0\u9ad8\u4e86\u89e3\u6790\u670d\u52a1\u7684\u6027\u80fd"),Object(b.b)("li",{parentName:"ul"},"[\u91cd\u6784]"," \u6388\u6743\u6838\u5fc3\u4ee3\u7801\uff0c\u4fdd\u6301\u548c\u5fae\u8f6f\u4e00\u81f4\u7684\u6388\u6743\u89c4\u8303 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I26DCB"},"#I26DCB")),Object(b.b)("li",{parentName:"ul"},"[\u79fb\u9664]"," ",Object(b.b)("inlineCode",{parentName:"li"},"App.GetRequestService<>")," \u65b9\u6cd5"),Object(b.b)("li",{parentName:"ul"},"[\u79fb\u9664]"," ",Object(b.b)("inlineCode",{parentName:"li"},"ValidateJwtBearer")," Jwt \u6388\u6743\u65b9\u6cd5\uff0c\u65e0\u9700\u624b\u52a8\u5224\u65ad\u4e86"))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u95ee\u9898\u4fee\u590d")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," Furion \u5b98\u65b9\u811a\u624b\u67b6\u751f\u6210\u540e\u7f16\u8bd1\u5f02\u5e38 bug"),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Tenant")," \u5185\u7f6e\u5c5e\u6027\u4e0d\u662f ",Object(b.b)("inlineCode",{parentName:"li"},"virtual")," \u4fee\u9970 bug"),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"dockerfile")," \u65b0\u547d\u540d\u6784\u5efa\u5931\u8d25 bug"),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u81ea\u5b9a\u4e49\u89d2\u8272\u6388\u6743\u548c\u591a\u4e2a\u6388\u6743\u5171\u5b58\u51fa\u73b0 403 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I26H1L"},"#I26H1L")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"httpContext.GetEndpoint()")," \u7a7a\u5f02\u5e38 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/pulls/73"},"#PR73")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Oops.Oh")," \u7a7a\u5f02\u5e38\u548c\u4e0d\u652f\u6301\u670d\u52a1\u670d\u52a1\u629b\u5f02\u5e38 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I26EFU"},"#I26EFU"),"\uff0c",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I26GM4"},"#I26GM4")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"cli.ps")," \u751f\u6210\u6587\u4ef6\u7f16\u7801\u4e71\u7801 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I26DVT"},"#I26DVT")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Swagger")," \u6587\u4ef6\u4e0a\u4f20\u6309\u94ae\u4e0d\u663e\u793a ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I26B6U"},"#I26B6U")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u89c4\u8303\u5316\u7ed3\u679c\u6388\u6743\u72b6\u6001\u7801\u5e8f\u5217\u5316\u5927\u5c0f\u5199\u4e0d\u4e00\u81f4\u95ee\u9898 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I26B26"},"#I26B26")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u672a\u542f\u7528\u89c4\u8303\u5316\u7ed3\u679c\u65f6\u4e2d\u6587\u4e71\u7801 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I268T5"},"#I268T5")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"MySql")," \u5f02\u6b65\u5f02\u5e38\u6355\u83b7\u4e0d\u5230 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I265SO"},"#I265SO")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"cli.ps1")," \u63d0\u793a\u627e\u4e0d\u5230\u6570\u636e\u5e93\u8fde\u63a5\u5b57\u7b26\u4e32 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2647U"},"#I2647U")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u5176\u4ed6\u66f4\u6539")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u5176\u4ed6]"," \u4ee3\u7801\u6027\u80fd\u5c0f\u4f18\u5316\u548c\u5c0f\u8c03\u6574"),Object(b.b)("li",{parentName:"ul"},"[\u5173\u95ed][#I265JV]","(",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I265JV)%EF%BC%8C%5B#I26ERA%5D(https://gitee.com/dotnetchina/Furion/issues/I26ERA)%EF%BC%8C"},"https://gitee.com/dotnetchina/Furion/issues/I265JV)\uff0c[#I26ERA](https://gitee.com/dotnetchina/Furion/issues/I26ERA)\uff0c")," ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I26EVW"},"#I26EVW"),"\uff0c",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I26GHC"},"#I26GHC"),"\uff0c",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I26GJ1"},"#I26GJ1"),"\uff0c",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I26O1F"},"#I26O1F")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u6587\u6863\u53d8\u5316")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u66f4\u65b0]"," \u4e00\u5206\u949f\u5165\u95e8\u3001\u5b89\u5168\u9274\u6743\u3001\u6570\u636e\u5e93\u7b49\u6587\u6863")))),Object(b.b)("hr",null),Object(b.b)("h2",{id:"v103\uff08\u5df2\u53d1\u5e03\uff09"},"v1.0.3\uff08\u5df2\u53d1\u5e03\uff09"),Object(b.b)("ul",null,Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u65b0\u7279\u6027")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," Mvc \u6a21\u677f\u811a\u624b\u67b6\uff1a",Object(b.b)("inlineCode",{parentName:"li"},"Fur.Template.Mvc")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," WebApi \u6a21\u677f\uff1a",Object(b.b)("inlineCode",{parentName:"li"},"Fur.Template.Api")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," Mvc/WebApi \u6a21\u677f\uff1a",Object(b.b)("inlineCode",{parentName:"li"},"Fur.Template.App")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," Razar Pages \u6a21\u677f\uff1a",Object(b.b)("inlineCode",{parentName:"li"},"Fur.Template.Razor")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," Blazor \u6a21\u677f\uff1a",Object(b.b)("inlineCode",{parentName:"li"},"Fur.Template.Blazor")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u7a81\u7834\u6027\u53d8\u5316")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," ",Object(b.b)("inlineCode",{parentName:"li"},"PagedList")," \u5230 ",Object(b.b)("inlineCode",{parentName:"li"},"System.Collections.Generic")," \u547d\u540d\u7a7a\u95f4\u4e0b"),Object(b.b)("li",{parentName:"ul"},"[\u4f18\u5316]"," \u89e3\u6790\u670d\u52a1\u6027\u80fd\u95ee\u9898\uff0c\u5e95\u5c42\u4ee3\u7801\u5927\u91cf\u4f18\u5316"))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u95ee\u9898\u4fee\u590d")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"ApiSears.ControllerEnd"),"\u4e0d\u8d77\u4f5c\u7528 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I25KH6"},"#I25KH6")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"RemoteRequest")," \u8bf7\u6c42\u5b8c\u6210\u7ed3\u679c\u5e8f\u5217\u5316\u5c5e\u6027\u5927\u5c0f\u5199\u95ee\u9898 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I25I8R"},"#I25I8R")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"HttpContext.GetEndpoinet()")," \u7a7a\u5f02\u5e38 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/pulls/73"},"#PR73")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u5176\u4ed6\u66f4\u6539")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"\u65e0"))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u6587\u6863\u53d8\u5316")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u66f4\u65b0]"," \u5165\u95e8\u6587\u6863\u3001\u6570\u636e\u5e93\u4e0a\u4e0b\u6587\u6587\u6863\u3001\u591a\u6570\u636e\u5e93\u64cd\u4f5c\u6587\u6863")))),Object(b.b)("hr",null),Object(b.b)("h2",{id:"v102\uff08\u5df2\u53d1\u5e03\uff09"},"v1.0.2\uff08\u5df2\u53d1\u5e03\uff09"),Object(b.b)("ul",null,Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u65b0\u7279\u6027")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Pomelo.EntityFrameworkCore.MySql")," \u6700\u65b0 .NET 5 \u5305\u914d\u7f6e ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I24ZQK"},"#I24ZQK")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},".AddDateTimeJsonConverter(format)")," \u65f6\u95f4\u683c\u5f0f\u5e8f\u5217\u5316\u914d\u7f6e"),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"DateTime")," \u548c ",Object(b.b)("inlineCode",{parentName:"li"},"DateTimeOffset")," \u7c7b\u578b\u5e8f\u5217\u5316\u683c\u5f0f\u914d\u7f6e ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I253FI"},"#I253FI")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u7a81\u7834\u6027\u53d8\u5316")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u66f4\u65b0]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Mapster")," \u5305\u81f3 ",Object(b.b)("inlineCode",{parentName:"li"},"7.0.0")," \u7248"),Object(b.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," ",Object(b.b)("inlineCode",{parentName:"li"},"App.Services")," \u540d\u4e3a ",Object(b.b)("inlineCode",{parentName:"li"},"App.ServiceProvider")),Object(b.b)("li",{parentName:"ul"},"[\u79fb\u9664]"," ",Object(b.b)("inlineCode",{parentName:"li"},"App.ApplicationServices")," \u548c ",Object(b.b)("inlineCode",{parentName:"li"},"App.GetRequestService<>()")),Object(b.b)("li",{parentName:"ul"},"[\u79fb\u9664]"," \u975e Web \u4e3b\u673a\u6ce8\u5165\u62d3\u5c55"))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u95ee\u9898\u4fee\u590d")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"services.AddFriendlyException()")," \u7f3a\u5c11\u914d\u7f6e\u6ce8\u5165 bug"),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u6570\u636e\u5e93\u4e0a\u4e0b\u6587\u6c60\u88ab\u91ca\u653e\u548c\u9ad8\u5e76\u53d1\u4e0b\u5185\u5b58\u6ea2\u51fa bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2524K"},"#I2524K"),"\uff0c",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I24UMN"},"#I24UMN")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Sql\u4ee3\u7406")," \u8fd4\u56de\u7a7a\u6570\u636e\u65f6\u5f02\u5e38 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I24TCK"},"#I24TCK")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u5de5\u4f5c\u5355\u5143 ",Object(b.b)("inlineCode",{parentName:"li"},"[UnitOfWork]")," \u591a\u6570\u636e\u5e93\u88ab\u91ca\u653e bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I24Q6W"},"#I24Q6W")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u5176\u4ed6\u66f4\u6539")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," ",Object(b.b)("inlineCode",{parentName:"li"},"EntityBase")," \u548c ",Object(b.b)("inlineCode",{parentName:"li"},"Entity")," \u6240\u6709\u5c5e\u6027\u4e3a ",Object(b.b)("inlineCode",{parentName:"li"},"vitural")," \u4fee\u9970"),Object(b.b)("li",{parentName:"ul"},"[\u4f18\u5316]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Jwt")," \u8bfb\u53d6\u548c\u89e3\u6790\u6027\u80fd"),Object(b.b)("li",{parentName:"ul"},"[\u4f18\u5316]"," \u4f18\u5316\u4ee3\u7801\u652f\u6301 C# 9.0 \u6700\u65b0\u8bed\u6cd5"),Object(b.b)("li",{parentName:"ul"},"[\u4f18\u5316]"," ",Object(b.b)("inlineCode",{parentName:"li"},"MD5")," \u52a0\u5bc6\u6027\u80fd ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/pulls/71"},"#PR71")),Object(b.b)("li",{parentName:"ul"},"[\u79fb\u9664]"," \u65e0\u7528\u6216\u672a\u4f7f\u7528\u4ee3\u7801"))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u6587\u6863")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u66f4\u65b0]"," \u6570\u636e\u5e93\u4e0a\u4e0b\u6587\u3001\u591a\u6570\u636e\u5e93\u3001\u4e00\u5206\u949f\u5165\u95e8\u6587\u6863")))),Object(b.b)("hr",null),Object(b.b)("h2",{id:"v100\uff08\u5df2\u53d1\u5e03\uff09"},"v1.0.0\uff08\u5df2\u53d1\u5e03\uff09"),Object(b.b)("ul",null,Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u65b0\u7279\u6027")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u7f51\u7edc\u8bf7\u6c42 ",Object(b.b)("inlineCode",{parentName:"li"},"RemoteRequest")," \u7ec4\u4ef6 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I1YYWD"},"#I1YYWD")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},".AddInjectBase()")," \u6ce8\u5165\uff0c\u53ea\u5305\u542b\u57fa\u7840\u670d\u52a1\u6ce8\u5165"),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u6240\u6709\u670d\u52a1\u90fd\u652f\u6301 ",Object(b.b)("inlineCode",{parentName:"li"},"IServiceCollection")," \u548c ",Object(b.b)("inlineCode",{parentName:"li"},"IMvcBuilder")," \u6ce8\u5165"),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u629b\u5f02\u5e38\u72b6\u6001\u7801\u8bbe\u7f6e\u529f\u80fd ",Object(b.b)("inlineCode",{parentName:"li"},"StatusCode")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Swagger")," \u5e8f\u5217\u5316\u652f\u6301 ",Object(b.b)("inlineCode",{parentName:"li"},"Pascal")," \u5c5e\u6027\u547d\u540d\u65b9\u5f0f"))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u7a81\u7834\u6027\u53d8\u5316")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u66f4\u65b0]"," ",Object(b.b)("strong",{parentName:"li"},"\u6240\u6709\u7684\u5305\u4e3a ",Object(b.b)("inlineCode",{parentName:"strong"},".NET 5")," \u6b63\u5f0f\u7248")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u95ee\u9898\u4fee\u590d")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"SqlProxy")," \u4ee3\u7406\u5f02\u6b65\u5904\u7406 bug"),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u6570\u636e\u5e93\u7c7b\u578b ",Object(b.b)("inlineCode",{parentName:"li"},"Datetime")," \u8f6c ",Object(b.b)("inlineCode",{parentName:"li"},"DateTimeOffset")," bug"),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u5c5e\u6027\u9996\u5b57\u6bcd\u5927\u5c0f\u5199\u5e8f\u5217\u5316\u4e0d\u5339\u914d\u51fa\u73b0 ",Object(b.b)("inlineCode",{parentName:"li"},"null")," bug"),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u5bf9\u8c61\u5e8f\u5217\u5316\u4e2d\u6587\u51fa\u73b0\u4e71\u7801 bug"),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u9ed8\u8ba4\u5e8f\u5217\u5316\u914d\u7f6e\u65e0\u6548 bug"),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u6570\u636e\u5e93\u975e\u4f9d\u8d56\u6ce8\u5165\u65b9\u5f0f\u63d0\u4ea4\u65e0\u6548 bug"),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u5e94\u7528\u7a0b\u5e8f\u6c60\u63d0\u4ea4\u6240\u6709 ",Object(b.b)("inlineCode",{parentName:"li"},"DbContext")," \u7a7a\u5f02\u5e38 bug"),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Saas")," \u591a\u79df\u6237 ",Object(b.b)("inlineCode",{parentName:"li"},"Tenant")," \u7c7b\u578b\u5b57\u7b26\u4e32\u5c5e\u6027\u5728 ",Object(b.b)("inlineCode",{parentName:"li"},"MySql")," \u6570\u636e\u5e93\u4e0b\u51fa\u73b0 ",Object(b.b)("inlineCode",{parentName:"li"},"longtext")," \u7c7b\u578b bug"),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Mvc")," \u81ea\u52a8\u9a8c\u8bc1\u5b57\u7b26\u4e32\u7a7a\u503c bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I24M2T"},"#I24M2T")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u679a\u4e3e\u6ce8\u91ca\u88ab\u8986\u76d6 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I24N6J"},"#I24N6J")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u5ffd\u7565\u89c4\u8303\u5316\u7ed3\u679c\u65e0\u6548 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I24B8P"},"#I24B8P")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Swagger")," \u9ed8\u8ba4 ",Object(b.b)("inlineCode",{parentName:"li"},"ContentType")," \u4e0d\u662f ",Object(b.b)("inlineCode",{parentName:"li"},"applicaiton/json")," bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I24F3U"},"#I24F3U")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u5185\u7f6e ",Object(b.b)("inlineCode",{parentName:"li"},"System.Text.Json")," \u548c ",Object(b.b)("inlineCode",{parentName:"li"},"Newtonsoft.Json")," \u51b2\u7a81 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I24F3U"},"#I24F3U")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u5176\u4ed6\u66f4\u6539")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Fur")," \u6846\u67b6\u57df\u540d\u4e3a\uff1a",Object(b.b)("a",{parentName:"li",href:"https://furion.pro"},"https://furion.pro")),Object(b.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," \u4ed3\u50a8 ",Object(b.b)("inlineCode",{parentName:"li"},"FromSqlRaw")," \u548c ",Object(b.b)("inlineCode",{parentName:"li"},"FromSqlInterpolated")," \u63a5\u53e3\u4f4d\u7f6e"),Object(b.b)("li",{parentName:"ul"},"[\u4f18\u5316]"," \u6570\u636e\u52a0\u89e3\u5bc6\u6027\u80fd\uff0c",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/pulls/70"},"#PR70")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u6587\u6863")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u66f4\u65b0]"," README.md\u3001\u6846\u67b6\u4ecb\u7ecd\u3001\u6570\u636e\u5e93\u4e0a\u4e0b\u6587\u3001\u914d\u7f6e\u9009\u9879\u3001\u591a\u79df\u6237\u3001\u8de8\u57df\u6587\u6863")))))}o.isMDXComponent=!0},205:function(e,t,a){"use strict";a.d(t,"a",(function(){return m})),a.d(t,"b",(function(){return O}));var i=a(0),n=a.n(i);function b(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function r(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,i)}return a}function l(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var b=Object.getOwnPropertySymbols(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var p=n.a.createContext({}),o=function(e){var t=n.a.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},m=function(e){var t=o(e.components);return n.a.createElement(p.Provider,{value:t},e.children)},s={inlineCode:"code",wrapper:function(e){var t=e.children;return n.a.createElement(n.a.Fragment,{},t)}},u=n.a.forwardRef((function(e,t){var a=e.components,i=e.mdxType,b=e.originalType,r=e.parentName,p=c(e,["components","mdxType","originalType","parentName"]),m=o(a),u=i,O=m["".concat(r,".").concat(u)]||m[u]||s[u]||b;return a?n.a.createElement(O,l(l({ref:t},p),{},{components:a})):n.a.createElement(O,l({ref:t},p))}));function O(e,t){var a=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var b=a.length,r=new Array(b);r[0]=u;var l={};for(var c in t)hasOwnProperty.call(t,c)&&(l[c]=t[c]);l.originalType=e,l.mdxType="string"==typeof e?e:i,r[1]=l;for(var p=2;p 3. 文件上传下载 | Furion - + @@ -30,7 +30,7 @@
using (var stream = System.IO.File.Create(filePath))
{
await formFile.CopyToAsync(stream);
}
}
}
return Ok(new { count = files.Count, size });
}
- + diff --git a/docs/blog/httpcontext/index.html b/docs/blog/httpcontext/index.html index 8cd4032c4af..bcf909a2096 100644 --- a/docs/blog/httpcontext/index.html +++ b/docs/blog/httpcontext/index.html @@ -8,7 +8,7 @@ 2. HttpContext 应用 | Furion - + @@ -27,7 +27,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

2. HttpContext 应用

dotNET China

dotNET China

为中国 .NET 开发者提供优质的资讯和技术分享。

HttpContext 重大调整#

ASP.NET 的时代,我们通常通过 HttpContext 全局静态类获取请求上下文,但在 ASP.NET Core 中,HttpContext 是一个非静态的抽象类,无法手动创建,也无法通过静态获取。

虽然在 ASP.NET Core 中无法直接获取 HttpContext 对象。但是微软也提供了注入 IHttpContextAccessor 方式获取。

HttpContext 多种获取方式#

ControllerBase 派生类中#

ControllerBase 派生类中,我们可以直接通过 HttpContext 属性获取 HttpContext 对象。

通过注入 IHttpContextAccessor#

Furion 框架中,默认已经注册了 IHttpContextAccessor 服务,所以我们可以通过构造函数注入该对象获取。

public class AppService
{
public AppService(IHttpContextAccessor httpContextAccessor)
{
var httpContext = httpContextAccessor.HttpContext;
}
}

通过 HttpContextLocal 静态类#

Furion 框架提供了 HttpContextLocal 静态类方式获取 HttpContext,如:

var HttpContext = HttpContextLocal.Current();

通过 App.HttpContext#

App 静态类也提供了 App.HttpContext 获取 HttpContext 对象。

HttpContext 拓展方法#

Furion 框架也提供了一些常用的 HttpContext 拓展方法

获取当前请求的特性#

var attribute = httpContext.GetMetadata<SomeAttribute>();

设置 Swagger 自动授权#

httpContext.SigninToSwagger("你的token");

退出 Swagger 授权#

httpContext.SignoutToSwagger();

获取本地 IP 地址#

var ipv4 = httpContext.GetLocalIpAddressToIPv4();
var ipv6 = httpContext.GetLocalIpAddressToIPv6();

获取客户端 IP 地址#

var ipv4 = httpContext.GetRemoteIpAddressToIPv4();
var ipv6 = httpContext.GetRemoteIpAddressToIPv6();

判断是否是 Ajax 请求#

var isAjaxRequest = httpContext.IsAjaxRequest();
- + diff --git a/docs/blog/index.html b/docs/blog/index.html index 83138785523..ae6ba09066e 100644 --- a/docs/blog/index.html +++ b/docs/blog/index.html @@ -8,7 +8,7 @@ Blog | Furion - + @@ -30,7 +30,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

3. 文件上传下载

dotNET China

dotNET China

为中国 .NET 开发者提供优质的资讯和技术分享。

文件下载#

[HttpGet, NonUnify]
public IActionResult FileDownload(string path, string fileName)
{
string filePath = Path.GetFullPath("~/temp/").Replace("~\\", "") + path;
return new FileStreamResult(new FileStream(filePath, FileMode.Open), "application/octet-stream") { FileDownloadName = fileName };
}

2. HttpContext 应用

dotNET China

dotNET China

为中国 .NET 开发者提供优质的资讯和技术分享。

HttpContext 重大调整#

ASP.NET 的时代,我们通常通过 HttpContext 全局静态类获取请求上下文,但在 ASP.NET Core 中,HttpContext 是一个非静态的抽象类,无法手动创建,也无法通过静态获取。

虽然在 ASP.NET Core 中无法直接获取 HttpContext 对象。但是微软也提供了注入 IHttpContextAccessor 方式获取。

HttpContext 多种获取方式#

- + diff --git a/docs/blog/tags/download/index.html b/docs/blog/tags/download/index.html index d2122dd9c6c..f4cc821e081 100644 --- a/docs/blog/tags/download/index.html +++ b/docs/blog/tags/download/index.html @@ -8,7 +8,7 @@ Posts tagged "download" | Furion - + @@ -28,7 +28,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

One post tagged with "download"

View All Tags

3. 文件上传下载

dotNET China

dotNET China

为中国 .NET 开发者提供优质的资讯和技术分享。

文件下载#

[HttpGet, NonUnify]
public IActionResult FileDownload(string path, string fileName)
{
string filePath = Path.GetFullPath("~/temp/").Replace("~\\", "") + path;
return new FileStreamResult(new FileStream(filePath, FileMode.Open), "application/octet-stream") { FileDownloadName = fileName };
}
- + diff --git a/docs/blog/tags/furion/index.html b/docs/blog/tags/furion/index.html index 2a21d67eaeb..29db1694d18 100644 --- a/docs/blog/tags/furion/index.html +++ b/docs/blog/tags/furion/index.html @@ -8,7 +8,7 @@ Posts tagged "furion" | Furion - + @@ -30,7 +30,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

3 posts tagged with "furion"

View All Tags

3. 文件上传下载

dotNET China

dotNET China

为中国 .NET 开发者提供优质的资讯和技术分享。

文件下载#

[HttpGet, NonUnify]
public IActionResult FileDownload(string path, string fileName)
{
string filePath = Path.GetFullPath("~/temp/").Replace("~\\", "") + path;
return new FileStreamResult(new FileStream(filePath, FileMode.Open), "application/octet-stream") { FileDownloadName = fileName };
}

2. HttpContext 应用

dotNET China

dotNET China

为中国 .NET 开发者提供优质的资讯和技术分享。

HttpContext 重大调整#

ASP.NET 的时代,我们通常通过 HttpContext 全局静态类获取请求上下文,但在 ASP.NET Core 中,HttpContext 是一个非静态的抽象类,无法手动创建,也无法通过静态获取。

虽然在 ASP.NET Core 中无法直接获取 HttpContext 对象。但是微软也提供了注入 IHttpContextAccessor 方式获取。

HttpContext 多种获取方式#

- + diff --git a/docs/blog/tags/furos/index.html b/docs/blog/tags/furos/index.html index 208f9b5b620..e859fe00d4e 100644 --- a/docs/blog/tags/furos/index.html +++ b/docs/blog/tags/furos/index.html @@ -8,7 +8,7 @@ Posts tagged "furos" | Furion - + @@ -30,7 +30,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

3 posts tagged with "furos"

View All Tags

3. 文件上传下载

dotNET China

dotNET China

为中国 .NET 开发者提供优质的资讯和技术分享。

文件下载#

[HttpGet, NonUnify]
public IActionResult FileDownload(string path, string fileName)
{
string filePath = Path.GetFullPath("~/temp/").Replace("~\\", "") + path;
return new FileStreamResult(new FileStream(filePath, FileMode.Open), "application/octet-stream") { FileDownloadName = fileName };
}

2. HttpContext 应用

dotNET China

dotNET China

为中国 .NET 开发者提供优质的资讯和技术分享。

HttpContext 重大调整#

ASP.NET 的时代,我们通常通过 HttpContext 全局静态类获取请求上下文,但在 ASP.NET Core 中,HttpContext 是一个非静态的抽象类,无法手动创建,也无法通过静态获取。

虽然在 ASP.NET Core 中无法直接获取 HttpContext 对象。但是微软也提供了注入 IHttpContextAccessor 方式获取。

HttpContext 多种获取方式#

- + diff --git a/docs/blog/tags/httpcontext/index.html b/docs/blog/tags/httpcontext/index.html index 1cdfde9c240..7b6e5d02f0d 100644 --- a/docs/blog/tags/httpcontext/index.html +++ b/docs/blog/tags/httpcontext/index.html @@ -8,7 +8,7 @@ Posts tagged "httpcontext" | Furion - + @@ -28,7 +28,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

One post tagged with "httpcontext"

View All Tags

2. HttpContext 应用

dotNET China

dotNET China

为中国 .NET 开发者提供优质的资讯和技术分享。

HttpContext 重大调整#

ASP.NET 的时代,我们通常通过 HttpContext 全局静态类获取请求上下文,但在 ASP.NET Core 中,HttpContext 是一个非静态的抽象类,无法手动创建,也无法通过静态获取。

虽然在 ASP.NET Core 中无法直接获取 HttpContext 对象。但是微软也提供了注入 IHttpContextAccessor 方式获取。

HttpContext 多种获取方式#

- + diff --git a/docs/blog/tags/index.html b/docs/blog/tags/index.html index a96c07e0bd2..5832aee5d39 100644 --- a/docs/blog/tags/index.html +++ b/docs/blog/tags/index.html @@ -8,7 +8,7 @@ Tags | Furion - + @@ -26,7 +26,7 @@ - + diff --git a/docs/blog/tags/net-5/index.html b/docs/blog/tags/net-5/index.html index a3169433611..65ab84c052b 100644 --- a/docs/blog/tags/net-5/index.html +++ b/docs/blog/tags/net-5/index.html @@ -8,7 +8,7 @@ Posts tagged ".net5" | Furion - + @@ -30,7 +30,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

3 posts tagged with ".net5"

View All Tags

3. 文件上传下载

dotNET China

dotNET China

为中国 .NET 开发者提供优质的资讯和技术分享。

文件下载#

[HttpGet, NonUnify]
public IActionResult FileDownload(string path, string fileName)
{
string filePath = Path.GetFullPath("~/temp/").Replace("~\\", "") + path;
return new FileStreamResult(new FileStream(filePath, FileMode.Open), "application/octet-stream") { FileDownloadName = fileName };
}

2. HttpContext 应用

dotNET China

dotNET China

为中国 .NET 开发者提供优质的资讯和技术分享。

HttpContext 重大调整#

ASP.NET 的时代,我们通常通过 HttpContext 全局静态类获取请求上下文,但在 ASP.NET Core 中,HttpContext 是一个非静态的抽象类,无法手动创建,也无法通过静态获取。

虽然在 ASP.NET Core 中无法直接获取 HttpContext 对象。但是微软也提供了注入 IHttpContextAccessor 方式获取。

HttpContext 多种获取方式#

- + diff --git a/docs/blog/tags/net/index.html b/docs/blog/tags/net/index.html index 4321fc6f0fb..f36c6696e23 100644 --- a/docs/blog/tags/net/index.html +++ b/docs/blog/tags/net/index.html @@ -8,7 +8,7 @@ Posts tagged ".net" | Furion - + @@ -30,7 +30,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

3 posts tagged with ".net"

View All Tags

3. 文件上传下载

dotNET China

dotNET China

为中国 .NET 开发者提供优质的资讯和技术分享。

文件下载#

[HttpGet, NonUnify]
public IActionResult FileDownload(string path, string fileName)
{
string filePath = Path.GetFullPath("~/temp/").Replace("~\\", "") + path;
return new FileStreamResult(new FileStream(filePath, FileMode.Open), "application/octet-stream") { FileDownloadName = fileName };
}

2. HttpContext 应用

dotNET China

dotNET China

为中国 .NET 开发者提供优质的资讯和技术分享。

HttpContext 重大调整#

ASP.NET 的时代,我们通常通过 HttpContext 全局静态类获取请求上下文,但在 ASP.NET Core 中,HttpContext 是一个非静态的抽象类,无法手动创建,也无法通过静态获取。

虽然在 ASP.NET Core 中无法直接获取 HttpContext 对象。但是微软也提供了注入 IHttpContextAccessor 方式获取。

HttpContext 多种获取方式#

- + diff --git a/docs/blog/tags/netcore/index.html b/docs/blog/tags/netcore/index.html index abb3adaaf77..208839e5947 100644 --- a/docs/blog/tags/netcore/index.html +++ b/docs/blog/tags/netcore/index.html @@ -8,7 +8,7 @@ Posts tagged ".netcore" | Furion - + @@ -30,7 +30,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

3 posts tagged with ".netcore"

View All Tags

3. 文件上传下载

dotNET China

dotNET China

为中国 .NET 开发者提供优质的资讯和技术分享。

文件下载#

[HttpGet, NonUnify]
public IActionResult FileDownload(string path, string fileName)
{
string filePath = Path.GetFullPath("~/temp/").Replace("~\\", "") + path;
return new FileStreamResult(new FileStream(filePath, FileMode.Open), "application/octet-stream") { FileDownloadName = fileName };
}

2. HttpContext 应用

dotNET China

dotNET China

为中国 .NET 开发者提供优质的资讯和技术分享。

HttpContext 重大调整#

ASP.NET 的时代,我们通常通过 HttpContext 全局静态类获取请求上下文,但在 ASP.NET Core 中,HttpContext 是一个非静态的抽象类,无法手动创建,也无法通过静态获取。

虽然在 ASP.NET Core 中无法直接获取 HttpContext 对象。但是微软也提供了注入 IHttpContextAccessor 方式获取。

HttpContext 多种获取方式#

- + diff --git a/docs/blog/tags/upload/index.html b/docs/blog/tags/upload/index.html index 4a36827dd4e..a381b46eaab 100644 --- a/docs/blog/tags/upload/index.html +++ b/docs/blog/tags/upload/index.html @@ -8,7 +8,7 @@ Posts tagged "upload" | Furion - + @@ -28,7 +28,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

One post tagged with "upload"

View All Tags

3. 文件上传下载

dotNET China

dotNET China

为中国 .NET 开发者提供优质的资讯和技术分享。

文件下载#

[HttpGet, NonUnify]
public IActionResult FileDownload(string path, string fileName)
{
string filePath = Path.GetFullPath("~/temp/").Replace("~\\", "") + path;
return new FileStreamResult(new FileStream(filePath, FileMode.Open), "application/octet-stream") { FileDownloadName = fileName };
}
- + diff --git a/docs/blog/welcome/index.html b/docs/blog/welcome/index.html index e7654b4eb62..11c3ba7d503 100644 --- a/docs/blog/welcome/index.html +++ b/docs/blog/welcome/index.html @@ -8,7 +8,7 @@ 1. Furion 介绍 | Furion - + @@ -27,7 +27,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

1. Furion 介绍

dotNET China

dotNET China

为中国 .NET 开发者提供优质的资讯和技术分享。

star fork GitHub stars GitHub forks GitHub license nuget

让 .NET 开发更简单,更通用,更流行。

💐 序言#

无私奉献不是天方夜谭,有时候,我们也可以做到。

🍕 名字的由来#

故事是这样子的:

自微软宣布 .NET 5 平台消息之后,就琢磨着开发一个基于 .NET 5 平台的开发框架,想做第一个吃 .NET 5 螃蟹尝鲜之人。

一开始想到了 Lazier 作为框架的名称,中文有 更懒 的意思。符合我的 “一切从简,只为了更懒” 的开发理念。

但是 更懒更烂 中文读音相近且没有特色,而且寓意也不是很好,对此换名问题苦恼了好些天。

刚好有一次在 QQ 群中无意间刷到了群友发的 “先知” 单词:Furion,就那一刻,就认定它了!

Furion 中文有 先知 的意思,恰好符合我创造框架的初衷。所以,Furion 就诞生了。

🍔 关于 LOGO#

Furion 标志设计理念是借鉴著名的 袋鼠理论 设计的。

袋鼠具有长腿、育袋、自我奔跑特点。

  • 长腿:代表着 Furion 拥有稳健的双腿,走在科技的前沿,走的更远,跑的更快。
  • 育袋:小育袋、大作为。期待 Furion 能够育孕出更多 .NET 优秀开发者和生机勃勃的生态。
  • 自我奔跑Furion 自身也要不断学习、不断进步、不断创新、不断开拓。

🍯 开源案例#

  • Admin.NET:基于 Furion 的通用权限管理平台。
  • 考试君:基于 Furion 的在线考试系统
  • 园丁:基于 Furion + Blazor 的超简单后台管理系统
  • Queer:基于 Furion + Layui 的通用型管理系统
  • Pear Admin:基于 Furion + PearAdmin 管理系统
  • JoyAdmin:基于 Furion + iviewadmin 开发的管理系统
  • YShop:基于 Furion + Vue 开发的移动电商项目

🍟 文档地址#

目前文档正在逐步完善中。

🥦 系列教程#

🌭 开源地址#

🍿 Docker 镜像#

  • Docker Hub 线上镜像
docker run --name furion -p 5000:80 monksoul/furion:v1.4.3
  • 手动 打包镜像

打开 CMD/Shell/PowerShell 进入 Furion 项目根目录打包 Furion 镜像:

docker build -t furion:v1.4.3 .

打包成功后,直接 docker run

docker run --name furion -p 5000:80 furion:v1.4.3

🥥 框架拓展包#

包类型名称版本描述
nugetFurionnugetFurion 核心包
nugetFurion.Extras.Authentication.JwtBearernugetFurion Jwt 拓展包
nugetFurion.Extras.DependencyModel.CodeAnalysisnugetFurion CodeAnalysis 拓展包
nugetFurion.Extras.Web.HttpContextnugetFurion HttpContext 拓展包
nugetFurion.Extras.ObjectMapper.MapsternugetFurion Mapster 拓展包
nugetFurion.Extras.DatabaseAccessor.SqlSugarnugetFurion SqlSugar 拓展包
nugetFurion.Extras.DatabaseAccessor.DappernugetFurion Dapper 拓展包
nugetFurion.Extras.Logging.SerilognugetFurion Serilog 拓展包

🍄 框架脚手架#

模板类型名称版本描述
nugetFurion.Template.MvcnugetMvc 模板
nugetFurion.Template.ApinugetWebApi 模板
nugetFurion.Template.AppnugetMvc/WebApi 模板
nugetFurion.Template.RazornugetRazorPages 模板
nugetFurion.Template.RazorWithWebApinugetRazorPages/WebApi 模板
nugetFurion.Template.BlazornugetBlazor 模板
nugetFurion.Template.BlazorWithWebApinugetBlazor/WebApi 模板

如何使用脚手架

🍎 框架特点#

  • 全新面貌:基于 .NET 5 平台,没有历史包袱
  • 极易入门:只需要一个 Inject() 即可完成配置
  • 极速开发:内置丰富的企业应用开发功能
  • 极少依赖:框架只依赖两个第三方包
  • 极其灵活:轻松面对多变复杂的需求
  • 极易维护:采用独特的架构思想,只为长久维护设计
  • 完整文档:提供完善的开发文档

🥞 架构设计#

正在整理中...

🥝 功能模块#

🥐 框架依赖#

Furion 为了追求极速入门,极致性能,尽可能的不使用或减少第三方依赖。目前 Furion 仅集成了以下两个依赖:

麻雀虽小五脏俱全。Furion 即使只集成了这两个依赖,但是主流的 依赖注入/控制反转AOP 面向切面编程,事件总线数据验证数据库操作 等等一个都不少。

🥗 环境要求#

  • Visual Studio 2019 16.8 +
  • .NET 5 SDK +
  • .Net Standard 2.1 +

🥪 支持平台#

  • 运行环境
    • Windows
    • Linux
    • MacOS
    • Docker/K8S/K3S/Rancher
    • Xamarin/MAUI
  • 数据库
    • SqlServer
    • Sqlite
    • Azure Cosmos
    • MySql
    • MariaDB
    • PostgreSQL
    • InMemoryDatabase
    • Oracle
    • Firebird
    • 达梦数据库
  • 应用部署
    • Kestrel
    • Nginx
    • Jexus
    • IIS
    • Apache
    • PM2
    • Supervisor
    • 单文件
    • 容器(Docker/K8S/K3S/Rancher)

🍖 关于性能#

Furion 目前采用 Visual Studio 2019 16.8 自带性能测试和 JMeter 进行测试,由于篇幅有限,只贴部分测试图,测试结果如下:


🌴 Stars 趋势图#

Stargazers over time

🍚 关于作者#

一个拥有近 13 年开发经验 .NETer。喜欢分享,喜欢新技术,在互联网多个技术领域皆有涉猎,MIP(dotNET China Most Influential Professional) 专家,同时多次获得开源中国 Gitee 授予 GVP 证书。

🍤 项目成员#

🎈 欢迎更多的开发者加入 Furion 大家庭。

🍝 他们都在用#

  • 百签科技(广东)有限公司
  • 码为科技(广州)有限公司
  • 夫上技术(阳江)有限公司
  • 广州启顺国际货运代理有限公司
  • 森丰供应链服务(广州)有限公司
  • 中山赢友网络科技有限公司
  • 中山模思软件科技有限公司
  • 珠海市恒泰新软件有限责任公司
  • 珠海思诺锐创软件有限公司
  • 深圳市易胜科技有限公司
  • 重庆虫儿飞科技有限公司
  • 重庆林木森科技有限公司
  • 深圳市品立方科技有限公司
  • 上海奥达科股份有限公司
  • 中山市泓升软件科技有限公司
  • 唐山天权建筑科技有限公司
  • 北京帝龙科技有限公司
  • 深圳市希立网络有限公司
  • 广州市飞帆计算机技术有限公司
  • 泉州市润海信息科技有限公司
  • 成都市彼岸里信息科技有限公司
  • 福建省山水生活服务集团有限公司
  • 安徽宝典网络科技有限公司
  • 西安空岛网络科技有限公司
  • 果糖大数据科技(南通)有限公司
  • 上海楷青信息技术有限公司
  • 上海邮银通信发展有限公司
  • 合纵动力软件科技有限公司
  • 深圳合纵动力软件科技有限公司
  • 北京帝龙科技有限公司

如果您的项目使用到 Furion 开发,可以告诉我们。

🍻 贡献代码#

Furion 遵循 Apache-2.0 开源协议,欢迎大家提交 PRIssue

如果要为项目做出贡献,请查看贡献指南

🍍 捐赠列表#

注:排序按捐赠顺序书写

捐赠人昵称捐赠金额(元)附语
🤴 爱吃油麦菜100感谢您的开源项目!
👳‍♂️ 麦壳饼200感谢您的开源项目!
👨 Sun100感谢您的开源项目!
👶 d61761720感谢您的开源项目!
👦 Diqiguoji00816.66见贤思齐
👲 nodyang100感谢您的开源项目!
👳‍♀️ mictxd100吹过的牛都实现。
🧓 欧流全10希望将来超越 Spring
👨‍⚕️ lionkon10...看了框架感觉拿来学习是很不错的...
😤 好人!10Nice 的小僧,我们的 dotnetchina 马上火起来了
😮 木木 Woody10感谢您的开源项目!
😚 Joker HouQQ 超级会员一个月
🤠 ccdfzQQ 专属红包 199
🌝 天夫李总支付宝 6666Furion 非常有意思,持续关注
😝 六尘子微信红包 199公司已经使用,小小敬意
🤠 ccdfzQQ 专属红包 200赞助一根内存条
🤑 邓亮灯28.88感谢您的开源项目!
😬 天道酬勤微信二维码 188小小心意
🥰 却月居士QQ 专属红包 100恭喜发财
🤩 鲁旭100感谢您的开源项目!
😬 散客行微信二维码 666终于找到一个不错的框架
😌 本心100项目功能很强大
🙆‍♂️ 毕业生100请你喝杯咖啡
🦹‍♀️ 猪鼻子微信二维码 668
🧟‍♂️ 明年·今日200使用的框架里最爽的,最理想的!加油
👨‍🎓 过去的过去50感谢您的开源项目!
👨‍🔧 万里兮100新公司的第一个项目从 Furion 开始
👴 Muphalem20很热心很亲切的开发者,加油!
💂‍♂️ 吃锅巴的码农微信二维码 500就冲你的文档写得好!
🤴 三重罗生门微信红包 200下次烤鱼你请!
🤵 李涛10加油,我们看到了 dotnet 美好的明天 :)
😂 !@#$%^&QQ 专属红包 100刚接触 furion,文档真棒
😵 李斌20看到一个不错的框架,学习学习,感谢作者的无私奉献
😞 逞强QQ 专属红包 20恭喜发财
🤒 顾锦松QQ 专属红包 200期待文档完成时候
🧟‍♀️ 哈哈微信赞赏码 1000点赞作者!
🍍 Z微信赞赏码 100恭喜孩子诞生,谢谢大佬
🍲 海涛50恭喜
😣 h微信赞赏码 100qq82683656
👱‍♀️ 冷大大微信赞赏码 100加快文档和教学补充哦,另外需要钉钉群,平常不用 QQ
👜 腾坤微信赞赏码 10感谢您的开源项目,QQ:565728589
🚆 文耶耶微信赞赏码 10很棒
🎟 Cynthiax微信转账 5000一路看着过来,小小心意
🥴 一花一世界微信赞赏码 10感谢开源,感谢持续更新
🥪 。微信赞赏码 2感谢
🎄微信赞赏码 20感谢你的开源项目
🍖 班卓微信赞赏码 9.9新年快乐
🥖 雨天裸奔的猫微信赞赏码 10加油!好东西,期待更多新特性
🍖 班卓微信赞赏码 9.9加个鸡腿
🍘 Egota Tiya微信赞赏码 6.66真的不错,准备使用这个框架
🤩 李氏天下微信赞赏码 200坚持下去
🎗 Trube微信赞赏码 200感恩
🧦 不长胡子的毛微信赞赏码 100Fur
👓 醉酒码农微信赞赏码 1000单次只能赞助 200,捐赠 5 次,支持 Furion
😢 XIUXIN微信赞赏码 20谢大佬,春天里的第一杯奶茶
👩‍🦳 吴鹏微信赞赏码 100感谢这么好的框架和文档
🧔 SymmmeeQQ 专属红包 20太牛了
🤴 隐居~~~QQ 专属红包 100支持一下吧
👵 饭粥微信赞赏码 666666666666
🎭 Free微信赞赏码 20感谢开源。比较敬业的架构师,支持一下
👑 时不待我微信赞赏码 50请你喝咖啡
😋 Eway5微信赞赏码 99找 abp 搜到 Furion 的,没想到国内有这么优秀的贡献者

非常感谢您们的支持,正是因为您们,中国开源才可以越走越远,Furion 越走越远。

如果想成为 Furion 支持者或赞助商,请考虑:

🥔 QQ 交流群#

dotNET 中国 ① 🥇(已满

dotNET 中国 ② 🥈(已满

dotNET 中国 ③(空余)

🧆 友情链接#

👉 Furion 👉 SqlSugar 👉 Layx 👉 t-io 👉 ThinkPHP 👉 Hutool 👉 BootstrapAdmin 👉 BootstrapBlazor 👉 IoTSharp 👉 Anno.Core 👉 WaterCloud 👉 OpenAuth.Net

🍵 特别鸣谢#

在这里特别感谢 QQ 网名:蓝狐星Furion 提供演示云服务器。

- + diff --git a/docs/docs/appstartup/index.html b/docs/docs/appstartup/index.html index dc1bbe0e14d..441fcb5a3ed 100644 --- a/docs/docs/appstartup/index.html +++ b/docs/docs/appstartup/index.html @@ -8,7 +8,7 @@ 3. 应用启动 Startup | Furion - + @@ -49,7 +49,7 @@
namespace Furion.Web.Entry
{
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
}
}
}
Startup.cs 代码迁移

只需要将 ConfigureServicesConfigure 方法代码迁移到 Furion.Web.Core.Startup.cs 中即可,而 Startup.cs 中两个方法留空即可。

非常简单吧。我们后续创建任何 MVCRazorPagesBlazor 项目只需要添加 Furion.Web.Core 引用和调用 Inject() 即可。

3.6 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by Monk
- + diff --git a/docs/docs/auth-control/index.html b/docs/docs/auth-control/index.html index e85b5edeae9..aaa92f744b5 100644 --- a/docs/docs/auth-control/index.html +++ b/docs/docs/auth-control/index.html @@ -8,7 +8,7 @@ 15. 安全鉴权 | Furion - + @@ -33,7 +33,7 @@
namespace Furion.Web.Core
{
/// <summary>
/// JWT 授权自定义处理程序
/// </summary>
public class JwtHandler : AppAuthorizeHandler
{
/// <summary>
/// 重写 Handler 添加自动刷新收取逻辑
/// </summary>
/// <param name="context"></param>
/// <returns></returns>
public override async Task HandleAsync(AuthorizationHandlerContext context)
{
// 自动刷新 token
if (JWTEncryption.AutoRefreshToken(context, context.GetCurrentHttpContext()))
{
await AuthorizeHandleAsync(context);
}
else context.Fail(); // 授权失败
}
/// <summary>
/// 验证管道,也就是验证核心代码
/// </summary>
/// <param name="context"></param>
/// <param name="httpContext"></param>
/// <returns></returns>
public override Task<bool> PipelineAsync(AuthorizationHandlerContext context, DefaultHttpContext httpContext)
{
// 检查权限,如果方法时异步的就不用 Task.FromResult 包裹,直接使用 async/await 即可
return Task.FromResult(true);
}
}
}

15.5.3 客户端部分#

客户端每次请求需将 accessTokenrefreshToken 放到请求报文头中传送到服务端,格式为:

Authorization: Bearer 你的token
X-Authorization: Bearer 你的刷新token
特别注意

在正常开发中,refreshToken 无需每次请求携带,而是 accessToken 即将过期之后携带即可。可以在客户端自行判断 accessToken 是否即将过期。

如果 Token 过期,那么 Furion 将自动根据有效期内的 refreshToken 自动生成新的 AceessToken,并在 响应报文 中返回,如:

access-token: 新的token
x-access-token: 新的刷新token
存储新的 Token

前端需要获取 响应报文 新的 token 和刷新 token 替换之前在客户处存储旧的 token 和刷新 token。

15.6 获取 Jwt 存储的信息#

// 获取 `Jwt` 存储的信息
var userId = App.User?.FindFirstValue("键");

注意引入 System.Security.Claims 命名空间

15.7 反馈与建议#

与我们交流

给 Furion 提 Issue


了解更多

想了解更多 鉴权授权 知识可查阅 ASP.NET Core - 安全和标识 章节。

Last updated on by 百小僧
- + diff --git a/docs/docs/author/index.html b/docs/docs/author/index.html index 6dd1c3fa157..30546dc97c7 100644 --- a/docs/docs/author/index.html +++ b/docs/docs/author/index.html @@ -8,7 +8,7 @@ 1.2 关于作者 | Furion - + @@ -22,7 +22,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

1.2 关于作者

互联网账号#

  • 百小僧
  • Monk/MonkSoul

技术能力#

自 2008 年 接触 IT 这个行业也有十余年了,在 后端(.NET/.NET Core/Java/PHP)、移动端(Xamarin/小程序/Java/Objective-C)、桌面端(Winform/WPF/Electron)、前端(Node/React/Vue/Angular)、设计(Photoshop、CDR、AI)等主流领域略知一二。

同时在技术培训领域也多有涉足。MIP(dotNET China Most Influential Professional) 专家,同时多次获得开源中国 Gitee 授予 GVP 证书。

兴趣爱好#

对新技术颇感兴趣,喜欢开源事业,喜欢分享技术。

喜欢看博客园、看开源中国、看 Github/Gitee、看抖音、看动漫、看美剧。

个人主页#

https://gitee.com/monksoul

https://github.com/monksoul

Last updated on by Monk
- + diff --git a/docs/docs/benchmark/index.html b/docs/docs/benchmark/index.html index 3857c01ce65..5f35501f01d 100644 --- a/docs/docs/benchmark/index.html +++ b/docs/docs/benchmark/index.html @@ -8,7 +8,7 @@ 29.3 基准测试 | Furion - + @@ -28,7 +28,7 @@
[Benchmark]
public byte[] Md5() => md5.ComputeHash(data);
}
public class Program
{
public static void Main(string[] args)
{
var summary = BenchmarkRunner.Run<Md5VsSha256>();
}
}
}

29.3.3.2 查看结果#

运行控制器程序,将得到以下结果

BenchmarkDotNet=v0.12.0, OS=Windows 10.0.17763.805 (1809/October2018Update/Redstone5)
Intel Core i7-7700K CPU 4.20GHz (Kaby Lake), 1 CPU, 8 logical and 4 physical cores
[Host] : .NET Framework 4.7.2 (4.7.3468.0), X64 RyuJIT
Net472 : .NET Framework 4.7.2 (4.7.3468.0), X64 RyuJIT
NetCoreApp30 : .NET Core 3.0.0 (CoreCLR 4.700.19.46205, CoreFX 4.700.19.46214), X64 RyuJIT
CoreRt30 : .NET CoreRT 1.0.28231.02 @Commit: 741d61493c560ba96e8151f9e56876d4d3828489, X64 AOT
Mono : Mono 6.4.0 (Visual Studio), X64
MethodRuntimeNMeanErrorStdDevRatio
Sha256.NET 4.7.210007.735 us0.1913 us0.4034 us1.00
Sha256.NET Core 3.010003.989 us0.0796 us0.0745 us0.50
Sha256CoreRt 3.010004.091 us0.0811 us0.1562 us0.53
Sha256Mono100013.117 us0.2485 us0.5019 us1.70
Md5.NET 4.7.210002.872 us0.0552 us0.0737 us1.00
Md5.NET Core 3.010001.848 us0.0348 us0.0326 us0.64
Md5CoreRt 3.010001.817 us0.0359 us0.0427 us0.63
Md5Mono10003.574 us0.0678 us0.0753 us1.24
Sha256.NET 4.7.21000074.509 us1.5787 us4.6052 us1.00
Sha256.NET Core 3.01000036.049 us0.7151 us1.0025 us0.49
Sha256CoreRt 3.01000036.253 us0.7076 us0.7571 us0.49
Sha256Mono10000116.350 us2.2555 us3.0110 us1.58
Md5.NET 4.7.21000017.308 us0.3361 us0.4250 us1.00
Md5.NET Core 3.01000015.726 us0.2064 us0.1930 us0.90
Md5CoreRt 3.01000015.627 us0.2631 us0.2461 us0.89
Md5Mono1000030.205 us0.5868 us0.6522 us1.74

29.3.3.3 导出报表#

也可以导出各种图表

29.3.4 反馈与建议#

与我们交流

给 Furion 提 Issue


了解更多

想了解更多 BenchmarkDotNet 知识可查阅 BenchmarkDotNet 官网

Last updated on by Monk
- + diff --git a/docs/docs/cache/index.html b/docs/docs/cache/index.html index 0d677ed1ff8..cb945409892 100644 --- a/docs/docs/cache/index.html +++ b/docs/docs/cache/index.html @@ -8,7 +8,7 @@ 14. 分布式缓存 | Furion - + @@ -43,7 +43,7 @@
await _cache.SetAsync("cachedTimeUTC", encodedCurrentTimeUTC, options);
return RedirectToPage();
}
}

14.6 分布式缓存建议#

确定 IDistributedCache 最适合你的应用的实现时,请考虑以下事项:

  • 现有基础结构
  • 性能要求
  • 成本
  • 团队经验

缓存解决方案通常依赖于内存中的存储以快速检索缓存的数据,但是,内存是有限的资源,并且很昂贵。 仅将常用数据存储在缓存中。

通常,Redis 缓存提供比 SQL Server 缓存更高的吞吐量和更低的延迟。 但是,通常需要进行基准测试来确定缓存策略的性能特征。

SQL Server 用作分布式缓存后备存储时,对缓存使用同一数据库,并且应用的普通数据存储和检索会对这两种情况的性能产生负面影响。 建议使用分布式缓存后备存储的专用 SQL Server 实例。

14.7 反馈与建议#

与我们交流

给 Furion 提 Issue


了解更多

想了解更多 分布式缓存 知识可查阅 ASP.NET Core - 分布式缓存 章节。

Last updated on by Monk
- + diff --git a/docs/docs/case/index.html b/docs/docs/case/index.html index 3dff9cee3cd..dc23db797e9 100644 --- a/docs/docs/case/index.html +++ b/docs/docs/case/index.html @@ -8,7 +8,7 @@ 1.4 框架案例 | Furion - + @@ -22,7 +22,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

1.4 框架案例

1.4.1 开源案例#

  • Admin.NET:基于 Furion 的通用权限管理平台。
  • 考试君:基于 Furion 的在线考试系统
  • 园丁:基于 Furion + Blazor 的超简单后台管理系统
  • Queer:基于 Furion + Layui 的通用型管理系统
  • Pear Admin:基于 Furion + PearAdmin 管理系统
  • JoyAdmin:基于 Furion + iviewadmin 开发的管理系统
  • YShop:基于 Furion + Vue 开发的移动电商项目

如果您使用了 Furion 进行项目开发,可以告诉我们,点击底部的 Edit this page 进行编辑添加。

Last updated on by Monk
- + diff --git a/docs/docs/configuration/index.html b/docs/docs/configuration/index.html index e223d4caa00..6d4c0c77a20 100644 --- a/docs/docs/configuration/index.html +++ b/docs/docs/configuration/index.html @@ -8,7 +8,7 @@ 4.1 配置 | Furion - + @@ -25,7 +25,7 @@
namespace Furion.Web.Entry.Controllers
{
[Route("api/[controller]")]
public class DefaultController : ControllerBase
{
[HttpGet]
public string Get([FromServices] IConfiguration configuration)
{
return $@"名称:{configuration["AppInfo:Name"]},
版本:{configuration["AppInfo:Version"]},
公司:{configuration["AppInfo:Company"]}";
}
}
}
依赖注入的方式

通过依赖注入注入实例有几种方式:

  • 构造函数注入方式
private readonly IConfiguration _configuration;
public DefaultController(IConfiguration configuration)
{
_configuration = configuration;
}
  • 参数注入方式 [FromServices]
public string Get([FromServices] IConfiguration configuration)
{
}
  • 属性注入方式
public IConfiguration Configuration { get; set; }

想了解更多关于《ASP.NET Core - 依赖注入》 知识

4.1.2.3 如何选择读取方式#

  • 在可依赖注入类中,依赖注入 IConfiguration 读取
  • 在静态类/非依赖注入类中,选择 App.Configuration[jsonKey] 读取

4.1.3 路径符 查找节点#

ASP.NET Core 中,配置采用 : 分隔符来读取分层配置数据。如上述例子中的 AppInfo:Name。如有更多层级数据则只需要通过 : 进入下一层节点即可。

假设我们有以下配置信息:

{
"AppInfo": {
"Name": "Furion",
"Version": "1.0.0",
"Company": {
"Name": "Baiqian",
"Address": {
"City": "中国",
"Province": "广东省",
"Detail": "中山市东区紫马公园西门"
}
}
}
}
var companyName = App.Configuration["AppInfo:Name"]; // => Furion

4.1.4 自定义配置文件#

大多情况下,我们的配置只需要在 appsettings.json 中配置即可,但一些特殊情况下,我们希望某些组件或功能拥有独立的配置,这个时候就需要用到自定义配置,Furion 目前支持 .json.xml 两种方式配置,如:

Furion.Web.Entry/emailsetting.json
{
"outlook": {
"smtp": {
"server": "smtp.office365.com",
"port": "587",
"ssl": "STARTTLS"
},
"pop": {
"server": "outlook.office365.com",
"port": "995",
"ssl": "TLS"
}
}
}
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<MyKey>MyXMLFile Value</MyKey>
<Position>
<Title>Title from MyXMLFile</Title>
<Name>Name from MyXMLFile</Name>
</Position>
<Logging>
<LogLevel>
<Default>Information</Default>
<Microsoft>Warning</Microsoft>
</LogLevel>
</Logging>
</configuration>
xml 配置事项

如果采用 xml 配置,那么文件名必须以 .config.xml 结尾(不区分大小写)。

特别说明

Furion 框架会在启动时自动扫描每一个项目层根目录下的 *.json*.xml 文件加入配置中,所以无需手工配置。

新增 *.json*.xml 文件的属性复制到输出目录设置为始终复制或较新复制,否则不会载入。另外配置文件不能出现重名,也就是保证整个项目中配置文件名字唯一。

同时 Furion 提供了非常灵活的方式支持自定义配置文件读取,如:

4.1.4.1 读取 emailsetting.json 配置#

读取自定义配置文件和读取 appsettings.json 一致,系统会自动从多个配置文件中读取输入,如:

var smtpServer = App.Configuration["outlook:smtp:server"]; // => smtp.office365.com

4.1.4.2 排除特定配置文件#

有些时候,我们不需要 .json.xml 自动载入配置中,我们只需要在启动层 appsettings.json 中添加 IgnoreConfigurationFiles 节点即可:

{
"IgnoreConfigurationFiles": ["runtime.json"]
}

4.1.5 不同环境读取#

在实际应用开发中,我们可能会根据不同的环境加载不同的配置文件,如 数据库连接字符串

这时我们只需要遵循特定命名规范 {name}.{Environment}.json 即可。如:

  • appsettings.Development.json
  • appsettings.Staging.json
  • appsettings.Production.json
  • emailsetting.Development.json
  • emailsetting.Staging.json
  • emailsetting.Production.json

这时,ASP.NET Core 会在应用启动时自动加载不同环境的配置文件。

4.1.6 配置更改通知(热更新#

.NET Core 应用程序中,配置支持更改通知,也就是热更新操作。一旦监听到 appsetting.json 或自定义配置文件发生变动,就会触发 OnChange 方法。代码如下:

var appInfoConfiguration = App.Configuration["AppInfo"];
ChangeToken.OnChange(() => appInfoConfiguration.GetReloadToken(), () =>
{
var name = appInfoConfiguration["Name"]; // 实时的最新值
var version = appInfoConfiguration["Version"]; // 实时的最新值
});

4.1.7 手动添加配置文件#

有些时候,我们的配置文件没有放在项目的根目录下,这时候我们需要手动载入自定义配置文件,只需要在 Program.cs 中加载即可:

public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((hostingContext, config) =>
{
// 加载自定义配置
config.AddJsonFile("MyConfig.json", optional: true, reloadOnChange: true);
})
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
补充说明
  • 获取项目目录:AppContext.BaseDirectory
  • 获取网站根目录:Directory.GetCurrentDirectory()

4.1.8 配置的优缺点#

  • 优点

    • 能够在系统运行时快速读取
    • 无需额外配置
  • 缺点

    • 存在重复读取
    • 通过硬编码字符串读取,容易出错
    • 不能设置默认值
    • 不能在运行环境中动态配置
    • 不能验证配置有效性
    • 不支持更改通知

4.1.9 配置使用场景#

如果只需要一次性读取配置信息,则使用配置,否则应该使用 《4.2 选项》代替。

4.1.10 反馈与建议#

与我们交流

给 Furion 提 Issue


了解更多

想了解更多 配置 知识可查阅 ASP.NET Core - 配置 章节。

Last updated on by SamWangCoder
- + diff --git a/docs/docs/contribute/index.html b/docs/docs/contribute/index.html index 44d34f75765..b189f8c6a58 100644 --- a/docs/docs/contribute/index.html +++ b/docs/docs/contribute/index.html @@ -8,7 +8,7 @@ 31. 贡献指南 | Furion - + @@ -22,7 +22,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

31. 贡献指南

提交错误报告#

如果您在 XXX 中发现了一个不存在安全问题的漏洞,请在 XXX 仓库中的 Issues 中搜索,以防该漏洞已被提交,如果找不到漏洞可以创建一个新的 Issues,如果发现了一个安全问题请不要将其公开,请参阅安全问题处理方式,提交错误报告时应该详尽。

安全问题处理#

本项目中对安全问题处理的形式,项目核心人员确认编辑,该部分内容可以根据项目情况添加。

解决现有问题#

通过查看仓库的 Issues 列表何以发现需要处理的问题信息,可以尝试解决其中的某个问题。

如何提出新功能#

提出新功能有些项目使用 Issues 的 Feature 标签进行管理,有些则通过邮件的形式统一收集,在收集后项目内人员会进行确认开发,一般的将确认开发的功能会放入下一个版本的任务列表。

如何设置开发环境并运行测试#

如果是通过 Git 管理可以从 git clone xxx 开始编写,将开发环境的配置信息,IDE 的设置等信息配置文档编写。

变更日志填写规则#

  1. 使用现在时态
  2. 第一行字数限制
  3. 提交内容的约束

编码约定#

  • 项目内编码约定文件:.editorconfig

分支处理约定#

  • 分支处理形式,如 gitFlow

合并 PR 的形式#

在什么情况下可以合并到 master/main:

  1. 通过 CI
  2. 两个及以上的维护者通过.
  3. 最新版本
Last updated on by Monk
- + diff --git a/docs/docs/cors/index.html b/docs/docs/cors/index.html index 65408df58a5..f32562c4fe9 100644 --- a/docs/docs/cors/index.html +++ b/docs/docs/cors/index.html @@ -8,7 +8,7 @@ 16. CORS 跨域 | Furion - + @@ -27,7 +27,7 @@
app.UseCorsAccessor();
// ...
}
}
}
特别注意

services.AddCorsAccessor(); 需在 services.AddControllers() 之前注册。

app.UseCorsAccessor(); 需在 app.UseRouting();app.UseAuthentication(); 之间注册。

16.4.2 配置允许跨域域名#

小提醒

默认情况下,Furion 允许所有域名来源访问,也就是无需配置任何来源域名,另外前端也需要设置请求参数:withCredentials:false

如果需要指定特定域名,则添加以下配置即可:

{
"CorsAccessorSettings": {
"PolicyName": "自定义跨域策略名",
"WithOrigins": ["http://localhost:4200", "https://furion.pro"]
}
}

16.5 CorsAccessorSettings 配置#

  • CorsAccessorSettings
    • PolicyName:跨域策略名,字符串类型,必填,默认 FurCorsAccessor
    • WithOrigins:允许跨域的域名列表,字符串数组类型,默认 [ "http://localhost:4200" ]
    • WithHeaders:请求表头,没有配置则允许所有表头,字符串数组类型
    • WithExposedHeaders:响应标头,字符串数组类型
    • WithMethods:设置跨域允许请求谓词,没有配置则允许所有,字符串数组类型
    • AllowCredentials:跨域请求中的凭据,bool 类型
    • SetPreflightMaxAge:设置预检过期时间,int 类型

16.6 使用 axios 前端注意事项#

由于 axios 对跨域有特定的需要,需要响应报文中添加特定 Header 才能放行,如:Access-Control-Expose-Headers: xxxxx,所以,如果前端使用了 axios 请求,需要添加以下配置:

{
"CorsAccessorSettings": {
"WithExposedHeaders": ["access-token","x-access-token"]
}
}

另外请求设置 withCredentials: false 即可。

16.7 使用 $.ajax 前端注意事项#

使用 Jquery 前端请求可以参考以下配置:

$.ajax({
       url: "http://localhost:8080/getdata",
       type: "GET",
       xhrFields: {
           withCredentials: true
       },
       crossDomain: true,
       success: function (res) {
           render(res);
       }
});

16.7 反馈与建议#

与我们交流

给 Furion 提 Issue


了解更多

想了解更多 跨域请求 知识可查阅 ASP.NET Core - 启用跨域请求 章节。

Last updated on by Monk
- + diff --git a/docs/docs/dapper/index.html b/docs/docs/dapper/index.html index 1ecdcb24242..58ff1fd6df2 100644 --- a/docs/docs/dapper/index.html +++ b/docs/docs/dapper/index.html @@ -8,7 +8,7 @@ 10.2. Dapper 集成 | Furion - + @@ -33,7 +33,7 @@
while (reader.Read())
{
IShape shape;
var type = (ShapeType)reader.GetInt32(typeColumnIndex);
switch (type)
{
case ShapeType.Circle:
shape = circleParser(reader);
break;
case ShapeType.Square:
shape = squareParser(reader);
break;
case ShapeType.Triangle:
shape = triangleParser(reader);
break;
default:
throw new NotImplementedException();
}
shapes.Add(shape);
}
}

10.2.5 反馈与建议#

与我们交流

给 Furion 提 Issue


了解更多

想了解更多 Dapper 知识可查阅 Dapper 官网

Last updated on by Monk
- + diff --git a/docs/docs/data-validation/index.html b/docs/docs/data-validation/index.html index 7850e058d51..cbe6018cca4 100644 --- a/docs/docs/data-validation/index.html +++ b/docs/docs/data-validation/index.html @@ -8,7 +8,7 @@ 8. 数据校验 | Furion - + @@ -75,7 +75,7 @@
namespace Furion.Web.Entry.Controllers
{
[ApiController]
public class MvcController : Controller
{
public IActionResult Index()
{
return View();
}
}
}

8.10 MiniProfiler 查看#

如下图所示:

8.11 多语言支持#

参见 【全球化和本地化(多语言)】 章节

8.12 集成 FluentValidation 第三方校验#

Furion 内置的验证已经可以满足绝大多数校验情况,但是对于 场景 验证目前暂未支持。这里推荐集成 FluentValidation 第三方校验组件。

8.12.1 安装 FluentValidation.AspNetCore 拓展包#

dotnet add package FluentValidation.AspNetCore

8.12.2 在 Startup.cs 中注册#

services.AddControllers()
.AddFluentValidation(fv => {
fv.RegisterValidatorsFromAssemblies(App.Assemblies);
});

8.12.3 使用例子#

public class Person {
public int Id { get; set; }
public string Name { get; set; }
public string Email { get; set; }
public int Age { get; set; }
}
public class PersonValidator : AbstractValidator<Person> {
public PersonValidator() {
RuleFor(x => x.Id).NotNull();
RuleFor(x => x.Name).Length(0, 10);
RuleFor(x => x.Email).EmailAddress();
RuleFor(x => x.Age).InclusiveBetween(18, 60);
}
}

在控制器中使用无需手动调用 ModelState.IsValid 进行判断,Furion 会自动执行该操作。

如需了解更多 FluentValidation 知识可查阅官方文档:https://fluentvalidation.net/

8.13 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by Monk
- + diff --git a/docs/docs/dbcontext-Interceptor/index.html b/docs/docs/dbcontext-Interceptor/index.html index 7838211b057..c71ee24bb67 100644 --- a/docs/docs/dbcontext-Interceptor/index.html +++ b/docs/docs/dbcontext-Interceptor/index.html @@ -8,7 +8,7 @@ 9.24 数据库操作拦截器 | Furion - + @@ -57,7 +57,7 @@
// 获取所有新增和更新的实体
var entities = dbContext.ChangeTracker.Entries()
.Where(u => u.State == EntityState.Added || u.State == EntityState.Modified);
foreach (var entity in entities)
{
switch (entity.State)
{
// 自动设置租户Id
case EntityState.Added:
entity.Property(nameof(Entity.TenantId)).CurrentValue = GetTenantId();
break;
// 排除租户Id
case EntityState.Modified:
entity.Property(nameof(Entity.TenantId)).IsModified = false;
break;
}
}
}

9.24.3 注册自定义过滤器#

定义好过滤器之后,我们需要在数据库上下文中注册:

services.AddDbPool<FurionDbContext>(interceptors: new IInterceptor[] {
new YourSqlConnectionProfilerInterceptor(),
new YourDbContextSaveChangesInterceptor(),
new YourSqlCommandProfilerInterceptor()
});

9.24.4 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by Monk
- + diff --git a/docs/docs/dbcontext-add-or-update/index.html b/docs/docs/dbcontext-add-or-update/index.html index e4f0c79dbc5..f9b91c0cb05 100644 --- a/docs/docs/dbcontext-add-or-update/index.html +++ b/docs/docs/dbcontext-add-or-update/index.html @@ -8,7 +8,7 @@ 9.7 新增或更新操作 | Furion - + @@ -100,7 +100,7 @@
// 示例七
await user.InsertOrUpdateExcludeNowAsync(new[] { u=>u.Name, u=>u.Age});
// 示例八
await user.InsertOrUpdateExcludeNowAsync(new[] {"Age", "Name"});

9.5.7 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by Monk
- + diff --git a/docs/docs/dbcontext-add/index.html b/docs/docs/dbcontext-add/index.html index 47c0735c871..746de403fb9 100644 --- a/docs/docs/dbcontext-add/index.html +++ b/docs/docs/dbcontext-add/index.html @@ -8,7 +8,7 @@ 9.5 新增操作 | Furion - + @@ -51,7 +51,7 @@
// 示例二
await repository.InsertNowAsync(new List<User> { user, user2 });
// 示例三
await repository.InsertNowAsync(new[] {user, user2 });
小知识

所有带 Now 结尾的表示立即提交到数据库,也就是立即调用 SaveChangesSaveChangesAsync

9.5.5 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by Monk
- + diff --git a/docs/docs/dbcontext-audit/index.html b/docs/docs/dbcontext-audit/index.html index f762d1dc2f5..d1786fb9378 100644 --- a/docs/docs/dbcontext-audit/index.html +++ b/docs/docs/dbcontext-audit/index.html @@ -8,7 +8,7 @@ 9.22 审计日志 | Furion - + @@ -61,7 +61,7 @@
// 判断是否请求成功,没有异常就是请求成功
var isRequestSucceed = actionContext.Exception == null;
// 这里写入日志~~~~~~~~~~~~~~~~~~~~
}
}
}
  1. 注册 RequestAuditFilter 筛选器
services.AddMvcFilter<RequestAuditFilter>();
关于筛选器注册顺序

通常先注册的会先执行,也可以通过实现 IOrderedFilter 接口配置 Order 属性,数值越小,越先执行。

9.22.4 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by sourcehome
- + diff --git a/docs/docs/dbcontext-batch/index.html b/docs/docs/dbcontext-batch/index.html index 01bd00e60a3..ae313a6b5b9 100644 --- a/docs/docs/dbcontext-batch/index.html +++ b/docs/docs/dbcontext-batch/index.html @@ -8,7 +8,7 @@ 9.9 批量操作 | Furion - + @@ -30,7 +30,7 @@
// 根据条件批量更新
repository.Where(a => a.ItemId <= 500).BatchUpdate(a => new Item { Quantity = a.Quantity + 100 });
repository.Where(a => a.ItemId <= 500).BatchUpdate(new Item { Description = "Updated" });
await repository.Where(a => a.ItemId <= 500).BatchUpdateAsync(new Item { Description = "Updated" });
// 批量更新指定列
var updateColumns = new List<string> { nameof(Item.Quantity) };
var q = repository.Where(a => a.ItemId <= 500);
int affected = q.BatchUpdate(new Item { Description = "Updated" }, updateColumns);

9.9.3 批量操作性能#

Operations\Rows100,000 EF100,000 EFBulk1,000,000 EFBulk
Insert38.98 s2.10 s17.99 s
Update109.25 s3.96 s31.45 s
Delete7.26 s2.04 s12.18 s
---------------------------------------------------------------
Together70.70 s5.88 s56.84 s

9.9.4 反馈与建议#

与我们交流

给 Furion 提 Issue


了解更多

想了解更多 EFCore.BulkExtensions 知识可查阅 EFCore.BulkExtensions 开源仓库

Last updated on by Monk
- + diff --git a/docs/docs/dbcontext-code-first/index.html b/docs/docs/dbcontext-code-first/index.html index 582083f762e..bf749dca363 100644 --- a/docs/docs/dbcontext-code-first/index.html +++ b/docs/docs/dbcontext-code-first/index.html @@ -8,7 +8,7 @@ 9.20 模型生成数据库 | Furion - + @@ -26,7 +26,7 @@
/// <summary>
/// 年龄
/// </summary>
public int Age { get; set; }
/// <summary>
/// 住址
/// </summary>
public string Address { get; set; }
}
}
实体约定

所有数据库实体必须直接或间接继承 IEntity 接口。

9.20.2.2 打开 程序包管理控制台#

9.20.2.3 切换默认项目#

程序包管理控制台 默认项目设置为 Furion.Database.Migrations

9.20.2.4 创建模型版本#

Add-Migration v1.0.0
特别说明

v1.0.0 是此处数据库更改的版本号,可以写任何字符串,但推荐写版本号,每次 +1

最终命令如下:

PM> Add-Migration v1.0.0
Build started...
Build succeeded.
Microsoft.EntityFrameworkCore.Model.Validation[10400]
Sensitive data logging is enabled. Log entries and exception messages may include sensitive application data, this mode should only be enabled during development.
Microsoft.EntityFrameworkCore.Infrastructure[10403]
Entity Framework Core 5.0.0-rc.1.20451.13 initialized 'FurionDbContext' using provider 'Microsoft.EntityFrameworkCore.Sqlite' with options: SensitiveDataLoggingEnabled DetailedErrorsEnabled MaxPoolSize=100 MigrationsAssembly=Furion.Database.Migrations
To undo this action, use Remove-Migration.
PM>

生成成功后,Furion.Database.Migrations 项目下会新增 Migrations 文件夹(如果没有),同时本次的架构生成文件,如:

9.20.2.5 更新到数据库#

Update-Database

执行该命令后,数据库就会自动根据模型生成对应的表。

小知识

如果 Update-Database 后面带字符串参数,则会自动还原数据库到指定版本,如:

Update-Database v0.0.3

将数据库还原到 v0.0.3 版本

9.20.3 更新模型#

如果模型改变了,重复上面操作即可,如:

Add-Migration v1.0.1
Update-Database

9.20.4 导出 Sql#

有些时候,我们没有直接更新数据库的权限,或者怕出问题,我们都会先生成 Sql 看看,这时候只需要通过 Script-Migration 导出即可,如:

Script-Migration

9.20.5 VS Code 方式#

9.20.5.1 安装 dotnet ef#

dotnet tool install --global dotnet-ef --version 5.0.0-rc.2.20475.6

9.20.5.2 cd 目录#

通过 VS Code 打开 .sln 所在的目录,如:framework

之后进入 Furion.Database.Migrations 目录

cd Furion.Database.Migrations

9.20.5.3 执行命令#

dotnet ef migrations add v1.0.0 -s "../Furion.Web.Entry"
dotnet ef database update -s "../Furion.Web.Entry"

9.20.6 反馈与建议#

与我们交流

给 Furion 提 Issue


了解更多

想了解更多 正向工厂 知识可查阅 EF Core - 管理数据库架构 章节。

Last updated on by engallon
- + diff --git a/docs/docs/dbcontext-db-first/index.html b/docs/docs/dbcontext-db-first/index.html index 6d57628c169..2c87ae6625b 100644 --- a/docs/docs/dbcontext-db-first/index.html +++ b/docs/docs/dbcontext-db-first/index.html @@ -8,7 +8,7 @@ 9.19 数据库生成模型 | Furion - + @@ -59,7 +59,7 @@
}
}
Furion Tools v1.0.0 全部实体生成成功!
PM>

9.19.4 命令参数配置#

Furion Tools Cli 支持多个参数配置,使用方法只需要在命令后面添加即可,如:

&"../tools/cli.ps1" -Context 数据库上下文名 -ConnectionName 连接字符串Key

支持参数如下:

  • -Tables:配置要生成的数据库表,数组类型,如果为空,则生成数据库所有表和视图。如:-Tables Person,PersonDetails
  • -Context:配置数据库上下文,默认 FurionDbContext,如果有多个数据库上下文,则此参数必须配置
  • -ConnectionName:配置数据库连接字符串,对应 appsetting.json 中的 Key
  • -OutputDir:生成实体代码输出目录,默认为:./Furion.Core/Entities/
  • -DbProvider:数据库提供器,默认是 Microsoft.EntityFrameworkCore.SqlServer,其他数据库请指定对应程序集
    • SqlServerMicrosoft.EntityFrameworkCore.SqlServer
    • SqliteMicrosoft.EntityFrameworkCore.Sqlite
    • CosmosMicrosoft.EntityFrameworkCore.Cosmos
    • InMemoryDatabaseMicrosoft.EntityFrameworkCore.InMemory
    • MySqlPomelo.EntityFrameworkCore.MySql
    • PostgreSQLNpgsql.EntityFrameworkCore.PostgreSQL
    • OracleOracle.EntityFrameworkCore
    • DmMicrosoft.EntityFrameworkCore.Dm
  • -EntryProject:Web 启用项目层名,默认 Furion.Web.Entry
  • -CoreProject:实体项目层名,默认 Furion.Core
  • -DbContextLocators:多数据库上下文定位器,默认 MasterDbContextLocator,支持多个,如:MasterDbContextLocator,MySqlDbContextLocator
  • -Product:解决方案默认前缀,如 Furion
  • -UseDatabaseNames:是否保持生成和数据库、表一致的名称
  • -Namespace:指定实体命名空间

9.19.5 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by Monk
- + diff --git a/docs/docs/dbcontext-delete/index.html b/docs/docs/dbcontext-delete/index.html index b1c4c7baab1..44d8fc652d0 100644 --- a/docs/docs/dbcontext-delete/index.html +++ b/docs/docs/dbcontext-delete/index.html @@ -8,7 +8,7 @@ 9.8 删除操作 | Furion - + @@ -67,7 +67,7 @@
// 示例五
await entity.FakeDeleteAsync();
// 示例六
await repository.UpdateIncludeAsync(user, u => u.IsDeleted);

9.8.8 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by Monk
- + diff --git a/docs/docs/dbcontext-entitytrigger/index.html b/docs/docs/dbcontext-entitytrigger/index.html index 556fdb56733..f959a31f9b5 100644 --- a/docs/docs/dbcontext-entitytrigger/index.html +++ b/docs/docs/dbcontext-entitytrigger/index.html @@ -8,7 +8,7 @@ 9.25. 实体数据监听器 | Furion - + @@ -29,7 +29,7 @@
/// <summary>
/// 监听数据改变之后(仅支持EFCore操作)
/// </summary>
/// <param name="newEntity">新值</param>
/// <param name="oldEntity">旧值</param>
/// <param name="dbContext"></param>
/// <param name="dbContextLocator"></param>
/// <param name="state"></param>
void OnChanged(TEntity newEntity, TEntity oldEntity, DbContext dbContext, Type dbContextLocator, EntityState state);
/// <summary>
/// 监听数据改变失败(仅支持EFCore操作)
/// </summary>
/// <param name="entity"></param>
/// <param name="dbContext"></param>
/// <param name="dbContextLocator"></param>
/// <param name="state"></param>
void OnChangeFailed(TEntity entity, DbContext dbContext, Type dbContextLocator, EntityState state) { }
}

9.29.5 [NotChangedListener] 跳过监听#

默认情况下,Furion 框架会对所有新增、更新、编辑的实体进行监听,有些时候我们无需监听特定实体,只需要在实体上贴 [NotChangedListener] 特性即可。

9.29.6 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by kingling
- + diff --git a/docs/docs/dbcontext-filter/index.html b/docs/docs/dbcontext-filter/index.html index 169381a8671..0449895c0a3 100644 --- a/docs/docs/dbcontext-filter/index.html +++ b/docs/docs/dbcontext-filter/index.html @@ -8,7 +8,7 @@ 9.23 实体/全局查询筛选器 | Furion - + @@ -34,7 +34,7 @@
// 创建表达式元素
var parameter = Expression.Parameter(metadata.ClrType, "u");
var properyName = Expression.Constant(nameof(Entity.IsDeleted));
var propertyValue = Expression.Constant(false);
// 构建表达式 u => EF.Property<bool>(u, "IsDeleted") == false
var expressionBody = Expression.Equal(Expression.Call(typeof(EF), nameof(EF.Property), new[] { typeof(bool) }, parameter, properyName), propertyValue);
var expression = Expression.Lambda(expressionBody, parameter);
return expression;
}
}
}
小建议

如果对动态构建 LambdaExpression 不熟悉的朋友,可以使用 System.Linq.Dynamic.Corehttps://github.com/zzzprojects/System.Linq.Dynamic.Core

9.23.3 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by Monk
- + diff --git a/docs/docs/dbcontext-function/index.html b/docs/docs/dbcontext-function/index.html index ddf405baf4e..a5e71ca0e09 100644 --- a/docs/docs/dbcontext-function/index.html +++ b/docs/docs/dbcontext-function/index.html @@ -8,7 +8,7 @@ 9.14 函数操作 | Furion - + @@ -46,7 +46,7 @@
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity(typeof(F_Person)).HasNoKey();
modelBuilder.HasDbFunction(() => GetPersons(default));
}
}
}

9.14.5.4 在 Linq 中使用#

IQueryable<F_Person> query = _repository.DynamicDbContext.GetPersons(1);
var result = query.Where(u => u.Name.Equals("Furion")).ToList();

最终生成 Sql

SELECT [g].Id, [g].Name, [g].Age, [g].Address
FROM dbo.GetPersons(1) AS [g]
WHERE [g].Name == N'Furion';

9.14.6 在 EF Core 内置函数#

EF Core 为我们提供了很多常用的内置函数,可以在 Lambda 条件中使用,主要是通过 EF.Functions 调用,如:

_repository.Where(u => EF.Functions.DateDiffHour(u.CreatedDt, DateTime.Now) > 8).FirstOrDefault();

这个语句使用了 EF.Functions.DateDiffHour 最终生成的 Sql 如下:

SELECT TOP(1) [a].*
FROM [dbo].[TEST] AS [a]
WHERE DATEDIFF(HOUR, [a].[CREATED_DT], GETDATE()) > 8

EF Core 内置函数就不一一列出了,可以通过 EF.Functions 查看更多,如果不能满足自己的需求,那么可以自定义 Linq 标量函数

9.14.7 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by Monk
- + diff --git a/docs/docs/dbcontext-hight-query/index.html b/docs/docs/dbcontext-hight-query/index.html index dedd0d4a8c9..2dd3e3898c8 100644 --- a/docs/docs/dbcontext-hight-query/index.html +++ b/docs/docs/dbcontext-hight-query/index.html @@ -8,7 +8,7 @@ 9.11 高级查询操作 | Furion - + @@ -68,7 +68,7 @@
namespace Furion.Core
{
public class Person : Entity, IEntityTypeBuilder<Person>
{
public string Name { get; set; }
/// <summary>
/// 配置实体关系
/// </summary>
/// <param name="entityBuilder"></param>
/// <param name="dbContext"></param>
/// <param name="dbContextLocator"></param>
public void Configure(EntityTypeBuilder<City> entityBuilder, DbContext dbContext, Type dbContextLocator)
{
entityBuilder.ToSqlQuery(
@"select * from dbo.person.2020-09-19
union all
select * from dbo.person.2020-09-20");
}
}
}
var posts = repository.Where(u => u.Id > 10).ToList();

9.11.14 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by Monk
- + diff --git a/docs/docs/dbcontext-locator/index.html b/docs/docs/dbcontext-locator/index.html index 00136b9848a..f8cbd628764 100644 --- a/docs/docs/dbcontext-locator/index.html +++ b/docs/docs/dbcontext-locator/index.html @@ -8,7 +8,7 @@ 9.2 数据库上下文定位器 | Furion - + @@ -25,7 +25,7 @@
namespace Furion.EntityFramework.Core
{
[AppDbContext("Sqlite3ConnectionString", DbProvider.Sqlite)]
public class DefaultDbContext : AppDbContext<DefaultDbContext> // 无需指定定位器
{
public DefaultDbContext(DbContextOptions<DefaultDbContext> options) : base(options)
{
}
}
}
关于多数据库定位器

默认数据库的定位器默认为 MasterDbContextLocator,所以无需显示指定定位器,但从第二个数据库开始,都必须指定数据库定位器。如:

  • 注册上下文:
options.AddDbPool<OtherDbContext, OtherDbContextLocator>();
  • 定义上下文
using Furion.DatabaseAccessor;
using Microsoft.EntityFrameworkCore;
namespace Furion.EntityFramework.Core
{
[AppDbContext("Sqlite3ConnectionString", DbProvider.Sqlite)]
public class OtherDbContext : AppDbContext<OtherDbContext, OtherDbContextLocator> // 需指定定位器
{
public OtherDbContext(DbContextOptions<OtherDbContext> options) : base(options)
{
}
}
}

另外,Entity/IEntityIRepository 等都需要指定定位器,如:IEntity<TKey, TLocator>IRepository<TEntity, TLocator> 操作。

9.2.5 数据库上下文定位器支持对象#

目前数据库上下文支持以下多个对象:

  • AppDbContext<TEntity, TDbContextLocator>:数据上下文
  • IRepository<TEntity, TDbContextLocator:实体仓储
  • ISqlRepository<TDbContextLocator>: Sql 操作仓储
  • Func<Type, DbContext>:依赖注入获取数据库上下文
  • Entity<Tkey, TDbContextLocator> :实体配置
  • EntityBase<Tkey, TDbContextLocator1, ... TDbContextLocator8>:实体配置
  • EntityNotKey<TDbContextLocator1, ... TDbContextLocator8>:无键实体配置
  • IEntitySeedData<TEntity, TDbContextLocator1, ... TDbContextLocator8>:种子数据配置
  • IEntityTypeBuilder<TEntity, TDbContextLocator1, ... TDbContextLocator8>:实体类型构建器
  • IModelBuilderFilter<TDbContextLocator1, ... TDbContextLocator8>:模型构建筛选器
  • [QueryableFunction(DbContextLocators=Type[])]:查询函数

9.2.6 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by Monk
- + diff --git a/docs/docs/dbcontext-multi-database/index.html b/docs/docs/dbcontext-multi-database/index.html index 805b5fbd92b..9ae1df327ab 100644 --- a/docs/docs/dbcontext-multi-database/index.html +++ b/docs/docs/dbcontext-multi-database/index.html @@ -8,7 +8,7 @@ 9.18 多数据库操作 | Furion - + @@ -39,7 +39,7 @@
// 支持一个数据库
public class Person: IEntity<MySqlDbContextLocator>
{
// ....
}
// 支持多个数据库
public class Person: IEntity<MySqlDbContextLocator, SqliteDbContextLocator>
{
// ....
}
小知识

所有的 实体依赖接口或抽象类 都支持泛型方式 指定 数据库上下文定位器,最多支持 8 个。

9.18.3.5 Linq 函数方式#

public static class QueryFunctions
{
[QueryableFunction("FN_GetId", "dbo", typeof(MySqlDbContextLocator), typeof(SqliteDbContextLocator))]
public static int GetId(int id) => throw new NotSupportedException();
}

9.18.4 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by 百小僧
- + diff --git a/docs/docs/dbcontext-proc/index.html b/docs/docs/dbcontext-proc/index.html index 61697581f41..8d7abcad370 100644 --- a/docs/docs/dbcontext-proc/index.html +++ b/docs/docs/dbcontext-proc/index.html @@ -8,7 +8,7 @@ 9.13 存储过程操作 | Furion - + @@ -117,7 +117,7 @@
// 获取 RETURN 返回值
var reval = result.ReturnValue;
// 获取返回结果集
var (list1,list2) = result.Result;
关于异步

Furion 框架每一个数据库操作都支持异步方式,由于篇幅有限,就不列举异步方式了。

9.13.3 关于 [DbParameter]#

[DbParameter] 特性是用来标注 Sql函数存储过程 参数的,可配置属性:

  • Direction:设置参数方向,ParameterDirection 枚举类型,默认 ParameterDirection.Input
  • DbType:设置参数类型,DbType 枚举类型,无默认
  • Size:设置参数长度的,int 类型

其中 Direction 属性是默认构造函数参数。

9.13.4 关于 ProcedureOutputResult#

ProcedureOutputResultProcedureOutputResult<TResult> 是复杂存储过程执行返回模型类,有以下属性:

  • OutputValues:多个输出值,ProcedureOutputValue 类型
  • ReturnValue:返回值,object 类型
  • Result:结果集,非泛型版本是 DataSet类型,否则是 泛型类型

9.13.5 存储过程参数#

所有 sql 参数都支持四种方式:

  • DbParameter[]:数组类型
  • new {}:匿名类型
  • new Class{}:强类型类型(支持复杂存储过程参数)
  • Dictionary<string,object> 类型

9.13.6 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by Monk
- + diff --git a/docs/docs/dbcontext-query/index.html b/docs/docs/dbcontext-query/index.html index 609d9bc9902..4226bdbf3c7 100644 --- a/docs/docs/dbcontext-query/index.html +++ b/docs/docs/dbcontext-query/index.html @@ -8,7 +8,7 @@ 9.10 查询操作 | Furion - + @@ -134,7 +134,7 @@
// 示例二
_testRepository.Where(u => u.Name.EndWith("Furion"));
// 示例三
_testRepository.Where(u => u.Name.Contains("Furion"));

9.10.6.9 Case When#

数据库中的 Case When 实际上对应的是我们程序中的 三元表达式 ,也就是使用 三元表达式 即可自动生成 Case When 语句。

9.10.7 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by zuohuaijun
- + diff --git a/docs/docs/dbcontext-read-write/index.html b/docs/docs/dbcontext-read-write/index.html index 3f085269a8a..907bba4cba1 100644 --- a/docs/docs/dbcontext-read-write/index.html +++ b/docs/docs/dbcontext-read-write/index.html @@ -8,7 +8,7 @@ 9.27 读写分离/主从复制 | Furion - + @@ -34,7 +34,7 @@
/// <summary>
/// 查询走从库
/// </summary>
/// <returns></returns>
public List<Person> Get()
{
return _msRepository.Slave1<Person>().AsEnumerable();
}
}
}

9.27.3 主从复制#

主从复制:是一种数据备份的方案。

简单来说,是使用两个或两个以上相同的数据库,将一个数据库当做主数据库,而另一个数据库当做从数据库。在主数据库中进行相应操作时,从数据库记录下所有主数据库的操作,使其二者一模一样。

9.27.4 主从复制几种方式#

9.27.4.1 同步复制#

所谓的同步复制,意思是 Master 的变化,必须等待 Slave-1,Slave-2,...,Slave-n 完成后才能返回。 这样,显然不可取,比如,在 Web 前端页面上,用户增加了条记录,需要等待很长时间。

9.27.4.2 异步复制#

如同 AJAX 请求一样。Master 只需要完成自己的数据库操作即可。至于 Slaves 是否收到二进制日志,是否完成操作,不用关心。(推荐方式)

9.27.4.3 半同步复制#

Master 只保证 Slaves 中的一个操作成功,就返回,其他 Slave 不管。

下面将使用 SqlServer 简单配置主从复制功能。

9.27.5 SqlServer 主库配置#

9.27.5.1 添加 本地发布#

9.27.5.2 选择 分发服务器#

9.27.5.3 启用 代理#

9.27.5.4 发布数据库#

9.27.5.5 快照发布#

具体选择何种发布类型,视具体业务场景而定。

9.27.5.6 选择发布项目#

9.27.5.7 配置分发计划#

9.27.5.8 配置安全设置#

9.27.5.9 完成配置#

9.27.6 SqlServer 从库配置#

9.27.6.1 添加 本地订阅#

9.27.6.2 选择 分发服务器#

9.27.6.3 选择 分发代理位置#

9.27.6.4 选择 订阅数据库#

9.27.6.5 选择 分发安全设置#

9.27.6.6 选择 同步计划#

9.27.6.7 完成订阅#

9.27.7 分发定义监视#

9.27.8 查看主从复制结果#

特别特性

主从复制有一定迟延性,所以系统设计要有一定“容忍性"。

9.27.9 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by Monk
- + diff --git a/docs/docs/dbcontext-repository/index.html b/docs/docs/dbcontext-repository/index.html index 40384d2f486..c10a7ad22d8 100644 --- a/docs/docs/dbcontext-repository/index.html +++ b/docs/docs/dbcontext-repository/index.html @@ -8,7 +8,7 @@ 9.4 仓储模式 | Furion - + @@ -30,7 +30,7 @@
ISqlRepository<MsSqlDbContextLocator> mssqlRepository;

动态 sql 方式

"select * from person".Change<MsSqlDbContextLocator>().SqlQuery();

实体配置方式

public class User:Entity<int, MsSqlDbContextLocator, MySqlDbContextLocator>
{
}

Sql 代理方式

[SqlFunction("funcName", DbContextLocator = typeof(MySqlDbContextLocator))]
int GetAge(int id);

Linq 中方式

[QueryableFunction("funcName","dbo", DbContextLocator = typeof(MySqlDbContextLocator))]
string GetName()=> throw Oops.Oh("不支持该数据库操作");

9.4.5 在后台任务中使用#

由于仓储默认注册为 Scoped 生命周期,另外 Furion 暂未提供在后台任务中使用仓储操作。如需操作数据库,可使用:

var dbContext = Db.GetNewDbContext();
// 或
var dbContext2 = Db.GetNewDbContext<TDbContextLocator>();
// 操作 person 表
var person = dbContext.Set<Person>().Find(1);

9.4.6 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by Monk
- + diff --git a/docs/docs/dbcontext-seed-data/index.html b/docs/docs/dbcontext-seed-data/index.html index c9d0972bbd5..6fdaff1c8bb 100644 --- a/docs/docs/dbcontext-seed-data/index.html +++ b/docs/docs/dbcontext-seed-data/index.html @@ -8,7 +8,7 @@ 9.21 实体种子数据 | Furion - + @@ -28,7 +28,7 @@
namespace Furion.Application
{
public class PersonSeedData : IEntitySeedData<Person>
{
// 配置种子数据
public IEnumerable<Person> HasData(DbContext dbContext, Type dbContextLocator)
{
return new List<Person>
{
new Person { Id = 1, Name = "百小僧", Address = "广东省中山市" },
new Person { Id = 2, Name = "新生帝", Address = "广东省珠海市" }
};
}
}
}

9.21.3 导航属性#

通常我们的实体有 一对多多对多等外键关系,那么我们需要单独为每一个实体添加数据种子,而不是直接写在主表中。

9.21.4 多个数据库种子数据#

Furion 提供泛型的方式支持多个数据库种子数据设定,如:

using Furion.DatabaseAccessor;
using System.Collections.Generic;
namespace Furion.Application
{
public class PersonSeedData : IEntitySeedData<Person, MySqlDbContextLocator, SqliteDbContextLocator>
{
// 配置种子数据
public IEnumerable<Person> HasData(DbContext dbContext, Type dbContextLocator)
{
return new List<Person>
{
new Person { Id = 1, Name = "百小僧", Address = "广东省中山市" },
new Person { Id = 2, Name = "新生帝", Address = "广东省珠海市" }
};
}
}
}

上面的例子表示同时为 MySqlDbContextSqliteDbContext 创建种子数据。

9.21.5 反馈与建议#

与我们交流

给 Furion 提 Issue


了解更多

想了解更多 数据种子 知识可查阅 EF Core - 数据种子设定 章节。

Last updated on by Monk
- + diff --git a/docs/docs/dbcontext-sql-proxy/index.html b/docs/docs/dbcontext-sql-proxy/index.html index d519e7f9b6e..9a907002275 100644 --- a/docs/docs/dbcontext-sql-proxy/index.html +++ b/docs/docs/dbcontext-sql-proxy/index.html @@ -8,7 +8,7 @@ 9.17 Sql 高级代理 | Furion - + @@ -72,7 +72,7 @@
namespace Furion.Application
{
public interface ISql : ISqlDispatchProxy
{
[SqlFunction("FN_Name")] // 标量函数
string GetValue(MyParam dto);
[SqlProcedure("FN_Name")] // 表值函数
List<Person> GetPersons(int id);
}
}
补充说明

Sql 代理会自动判断返回值然后自动执行特定函数类型。

9.17.6 为什么用它?#

通过上面的例子大家就可以了解,这种方式操作 sql 非常简单,而且极易维护。大家不用去关心返回值,关心用哪个方法,所有东西会自动给你处理好。

所以,如果需要用 Sql 操作,推荐使用 Sql 高级代理。

9.17.7 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by AiGlory
- + diff --git a/docs/docs/dbcontext-sql-template/index.html b/docs/docs/dbcontext-sql-template/index.html index b5e03106759..7bc7d46add0 100644 --- a/docs/docs/dbcontext-sql-template/index.html +++ b/docs/docs/dbcontext-sql-template/index.html @@ -8,7 +8,7 @@ 9.16 Sql 模板 | Furion - + @@ -24,7 +24,7 @@
// 懒人方式
var users = "#(Select.User)".SqlQuery<User>(new { id = 1});
// Sql 代理方式
[SqlExecute("#(Select.User)")]
List<User> GetUser(int id);

9.16.3.2 高级嵌套#

var users = repository.SqlQuery<User>(
@"select * from user u
left join #(User.Detail) d on u.Id = d.UserId
where id > @id");

9.16.4 Sql 模板配置#

9.16.4.1 普通模式#

{
"Select.User": "select * from User"
}

9.16.4.2 更多配置#

{
"Select.User": {
"Sql": "select * from User where id > @id and Name = @name",
"Params": [
{
"Name": " Id",
"Value": "1",
"DbType": "Int16",
"Size": 10
},
{
"Name": " Name",
"Value": "百小僧",
"DbType": "String",
"Size": 10
}
]
}
}

9.16.5 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by Monk
- + diff --git a/docs/docs/dbcontext-sql/index.html b/docs/docs/dbcontext-sql/index.html index 4ba9c5d06cf..8e127b7b13c 100644 --- a/docs/docs/dbcontext-sql/index.html +++ b/docs/docs/dbcontext-sql/index.html @@ -8,7 +8,7 @@ 9.15 Sql 操作 | Furion - + @@ -169,7 +169,7 @@
// 不再举例子。。。
补充说明

不管是哪种方式操作 Sql ,方法名参数都是一致的,如:

  • SqlQuery
  • SqlQueryAsync
  • SqlQueries
  • SqlQueriesAsync
  • SqlNonQuery
  • SqlNonQueryAsync
  • SqlScalar
  • SqlScalarAsync
  • SqlProcedureQuery
  • SqlProcedureQueryAsync
  • SqlProcedureQueries
  • SqlProcedureQueriesAsync
  • SqlProcedureScalar
  • SqlProcedureScalarAsync
  • SqlProcedureNonQuery
  • SqlProcedureNonQueryAsync
  • SqlProcedureOutput
  • SqlProcedureOutputAsync
  • SqlFunctionScalar
  • SqlFunctionScalarAsync
  • SqlFunctionQuery
  • SqlFunctionQuery

9.15.6 IRepository 操作#

IRepository 也能操作 sql,调用方法也是和上面一致的,如:

var dataTable = repository.Sql().SqlQuery("select * from person");
特别说明

由于篇幅有限,不再列举所有例子。

9.15.7 IRepository<TEntity> 操作#

IRepository<TEntity> 也能操作 sql,调用方法也是和上面一致的,如:

var dataTable = personRepository.SqlQuery("select * from person");
特别说明

由于篇幅有限,不再列举所有例子。

9.15.8 关于 Sql 参数#

所有 sql存储过程函数 参数都支持四种方式:

  • DbParameter[]:数组类型
  • new {}:匿名类型
  • new Class{}:强类型类型(支持复杂存储过程参数)
  • Dictionary<string,object> 类型
小知识

建议除了复杂的存储过程(带 OUTPUT/RETURN)的以外,所有参数建议使用 new {} 匿名类型,如果需要动态参数,则可以使用 Dictionary<string,object> 类型。

9.15.9 多数据库 Sql 操作 💯 💛#

Furion 框架拥有非常灵活的多数据库操作方式,只需通过多数据库上下文定位器即可动态切换数据库。

9.15.9.1 懒人无敌 🐮 方式#

var dataTable = "select * from person".Change<MySqlDbContextLocator>().SqlQuery();
var persons = "select * from person whre id > @id".Change<SqliteDbContextLocator>().SqlQuery<Person>();
补充说明

懒人方式 只需要通过 Change<TDbContextLocator> 方式即可动态切换数据库。

9.15.9.2 ISqlRepository 方式#

只需要通过 ISqlRepository<TDbContextLocator> 注入或通过 sqlRepository.Change<TDbContextLocator>() 切换。

9.15.9.3 IRepository 方式#

只需要通过 repository.Change<TDbContextLocator>() 获取即可。

9.15.9.4 IRepository<TEntity> 方式#

只需要通过 IRepository<TEntity, TDbContextLocator> 注入或通过 personRepository.Change<TEntity, TDbContextLocator>() 切换。

9.15.10 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by Monk
- + diff --git a/docs/docs/dbcontext-start/index.html b/docs/docs/dbcontext-start/index.html index 523810154cc..8967baff20f 100644 --- a/docs/docs/dbcontext-start/index.html +++ b/docs/docs/dbcontext-start/index.html @@ -8,7 +8,7 @@ 9.0 入门简要 | Furion - + @@ -27,7 +27,7 @@
namespace Furion.EntityFramework.Core
{
[AppStartup(600)]
public sealed class FurEntityFrameworkCoreStartup : AppStartup
{
public void ConfigureServices(IServiceCollection services)
{
// 配置数据库上下文,支持N个数据库
services.AddDatabaseAccessor(options =>
{
// 配置默认数据库
options.AddDbPool<FurionDbContext>(DbProvider.SqlServer, connectionString:"连接字符串");
// 配置多个数据库,多个数据库必须指定数据库上下文定位器
options.AddDbPool<SqliteDbContext, SqliteDbContextLocaotr>(DbProvider.Sqlite, connectionString:"连接字符串");
});
}
}
}
新版 MySQL 注意

MySQL 在新版本包中注册有所修改,所以注册方式为:

services.AddDatabaseAccessor(options =>
{
options.AddDbPool<FurionDbContext>($"{DbProvider.MySql}@8.0.22");
});

9.0.1.5 Code First 说明#

特别注意

Furion 框架默认数据迁移的程序集为:Furion.Database.Migrations,所以如果您改了程序集名称或通过 Nuget 方式安装的 Furion 包,则需要配置迁移程序集名称:

services.AddDatabaseAccessor(options =>
{
options.AddDbPool<FurionDbContext>(DbProvider.Sqlite);
}, "自定义迁移名称");

另外,如果应用中配置了多个数据库上下文,那么所有的 迁移命令 都需要指定 -Context 数据库上下文名称 参数。如:

Add-Migration v1.0.0 -Context FurionDbContext

9.0.2 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by Monk
- + diff --git a/docs/docs/dbcontext-update/index.html b/docs/docs/dbcontext-update/index.html index c598ba9c554..8acd86c2a01 100644 --- a/docs/docs/dbcontext-update/index.html +++ b/docs/docs/dbcontext-update/index.html @@ -8,7 +8,7 @@ 9.6 更新操作 | Furion - + @@ -170,7 +170,7 @@
// 示例二
await repository.UpdateNowAsync(new List<User> { user, user2 });
// 示例三
await repository.UpdateNowAsync(new[] {user, user2 });
小知识

所有带 Now 结尾的表示立即提交到数据库,也就是立即调用 SaveChangesSaveChangesAsync

9.6.15 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by Monk
- + diff --git a/docs/docs/dbcontext-view/index.html b/docs/docs/dbcontext-view/index.html index a12ad9922a8..996e6b7bc7c 100644 --- a/docs/docs/dbcontext-view/index.html +++ b/docs/docs/dbcontext-view/index.html @@ -8,7 +8,7 @@ 9.12 视图操作 | Furion - + @@ -30,7 +30,7 @@
public FurionService(IRepository<V_Person> repository)
{
// 初始化只读仓储
_readableRepository = repository.Constraint<IReadableRepository<V_Person>>();
}
/// <summary>
/// 读取视图
/// </summary>
/// <returns></returns>
public async Task<List<V_Person>> GetVPerson()
{
var list = await _readableRepository.AsAsyncEnumerable();
return list;
}
}
}
小知识

通过 .Constraint<TEntity,TDbContextLocator> 方法可以将仓储约束为特定仓储,如只读仓储,可读可写仓储,只新增仓储等。

9.12.5 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by Monk
- + diff --git a/docs/docs/dbcontext/index.html b/docs/docs/dbcontext/index.html index 4974e44d639..2773124f07b 100644 --- a/docs/docs/dbcontext/index.html +++ b/docs/docs/dbcontext/index.html @@ -8,7 +8,7 @@ 9.1 数据库上下文 | Furion - + @@ -34,7 +34,7 @@
options.AddDbPool<ThirdDbContext, ThirdDbContextDbContextLocator>(DbProvider.SqlServer); // 第三个数据库

9.1.8 动态数据库上下文对象#

Furion 框架中,数据库上下文是定义在 Furion.EntityFramework.Core 项目层,并且该层不被 Furion.ApplicationFurion.Core 等层引用。

所以就不能直接在 Furion.Application 项目层直接使用 Furion.EntityFramework.Core 定义的数据库上下文。

Furion 为了解决这个问题,提供了两种方式处理:

  • respository.Context :当前数据库上下文对象,返回是 DbContext 抽象类型
  • respository.DynamicContext:当前数据库上下文对象,返回的是 dynamic 类型

如果你只是想使用 DbContext 的功能,直接使用 respository.Context 即可,如:

respository.Context.SaveChanges();

如果你想能够获取具体的数据库上下文类型,如 MyDbContext,那么使用 respository.DynamicContext 就可以获取到具体的 MyDbContext 类型。如:

var persons = respository.DynamicContext.Persons.Find(1);
var users = respository.DynamicContext.Users;

这样就可以直接操作 MyDbContext 定义的属性和方法了。

9.1.9 在后台任务中使用#

由于 DbContext 默认注册为 Scoped 生存周期,所以在后台任务中使用 DbContext 需通过静态创建方式,如:

using (var dbContext = Db.GetNewDbContext())
{
}
// 或
using(var dbContext2 = Db.GetNewDbContext<TDbContextLocator>())
{
}

9.1.10 反馈与建议#

与我们交流

给 Furion 提 Issue


了解更多

想了解更多 数据库上下文 知识可查阅 EF Core - 配置 DbContext 章节。

Last updated on by Monk
- + diff --git a/docs/docs/dependency-injection/index.html b/docs/docs/dependency-injection/index.html index 2c37aeb02f6..19aba5f75ac 100644 --- a/docs/docs/dependency-injection/index.html +++ b/docs/docs/dependency-injection/index.html @@ -8,7 +8,7 @@ 12. 依赖注入/控制反转 | Furion - + @@ -63,7 +63,7 @@
return result;
}
}
}

之后我们只需要为 TestService 增加 [Injection] 特性即可,如:

[Injection(Proxy = typeof(LogDispatchProxy))]
public class TestService: ITestService, ITransient
{
public string SayHello(string word)
{
return $"Hello {word}";
}
}

之后 SayHello 方法被调用的时候就可以实现动态拦截了,比如这里写日志。

12.12.1 全局Aop拦截#

Furion 框架也提供了全局拦截的方式,只需要将 IDispatchProxy 修改为 IGlobalDispatchProxy 即可。

using Furion;
using System.Reflection;
namespace Furion.Application
{
public class LogDispatchProxy : AspectDispatchProxy, IGlobalDispatchProxy
{
// ....
}
}

这样就会拦截所有的 Service,当然也可以通过给特定类贴 [SkipProxy] 跳过全局拦截操作。

拦截优先级

[SkipProxy] > [Injection(Proxy = typeof(LogDispatchProxy))] > 全局拦截

12.12.2 AOP 注入解析服务#

Furion 框架未提供 Proxy 构造函数注入功能,但是提供了 Services 属性,如果需要解析服务,则可以通过以下方式:

var someServices = Services.GetService<ISomeService>(); // 推荐方式
// 或
var someServices = App.GetService<ISomeService>();

12.12.3 AOP 的作用#

这种面向切面的能力(动态拦截/代理)可以实现很多很多功能,如:

  • 动态日志记录
  • 动态修改参数
  • 动态修改返回值
  • 动态方法重定向
  • 动态修改代码逻辑
  • 动态实现异常监听

还可以做更多更多的事情。

12.13 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by 百小僧
- + diff --git a/docs/docs/deploy-docker-auto/index.html b/docs/docs/deploy-docker-auto/index.html index 06eb42d01b7..078ab39fe16 100644 --- a/docs/docs/deploy-docker-auto/index.html +++ b/docs/docs/deploy-docker-auto/index.html @@ -8,7 +8,7 @@ 29.1 Docker 环境持续部署 | Furion - + @@ -57,7 +57,7 @@
#判斷是否存在
CID=$(docker ps | grep "${containerName}" | awk '{print $1}')
echo $CID
if [ "$CID" != "" ];then
docker stop ${containerName}
docker rm ${containerName}
docker rmi ${containerName}
#docker stop $CID
#docker rm $CID
fi
cd ${webDir}/ && docker build -t ${containerName} .
docker run --name ${containerName} --restart=always -d -p ${port}:${port} --link myredis:myredis -v /etc/localtime:/etc/localtime:ro ${containerName}

这里的逻辑就是解压,然后 Docker 相关。每次构建都是带着版本号来的

29.1.5 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by zuohuaijun
- + diff --git a/docs/docs/deploy-docker/index.html b/docs/docs/deploy-docker/index.html index 6f54fa4e57d..309fbf50b32 100644 --- a/docs/docs/deploy-docker/index.html +++ b/docs/docs/deploy-docker/index.html @@ -8,7 +8,7 @@ 28.2 在 Docker 部署 | Furion - + @@ -26,7 +26,7 @@
# Restore And Publish
WORKDIR /source/samples
RUN dotnet restore
RUN dotnet publish -c release -o /app --no-restore
# Run
FROM mcr.microsoft.com/dotnet/aspnet:5.0.1
WORKDIR /app
COPY --from=build /app ./
EXPOSE 80
EXPOSE 443
ENTRYPOINT ["dotnet", "Furion.Web.Entry.dll"]
  • 👉 在 Dockerfile 所在路径构建

接下来的步骤和上述步骤一致,不再重复编写

28.2.3 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by Monk
- + diff --git a/docs/docs/deploy-iis/index.html b/docs/docs/deploy-iis/index.html index 7d2275658bf..3e0eac82574 100644 --- a/docs/docs/deploy-iis/index.html +++ b/docs/docs/deploy-iis/index.html @@ -8,7 +8,7 @@ 28.1 在 IIS 部署 | Furion - + @@ -22,7 +22,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

28.1 在 IIS 部署

28.1.1 发布网站#

28.1.1.1 选择启动项发布#

28.1.1.2 选择发布到文件夹#

28.1.1.3 配置发布后路径#

28.1.1.4 点击发布#

28.1.2 服务器环境配置#

28.1.2.1 第一步#

安装.NET Core 运行时捆绑包:点击下载

28.1.2.2 第二步(命令)#

net stop was /y

28.1.2.3 第三步(命令)#

net start w3svc

28.1.2.4 第四步(命令)#

set ASPNETCORE_ENVIRONMENT=Production

28.1.3 部署到 IIS#

28.1.3.1 添加新网站#

28.1.3.2 配置网站信息#

28.1.3.3 配置应用程序池#

28.1.3.4 设置为 非托管#

28.1.3.5 重启网站#

只需重启网站或应用程序池即可。

28.1.4 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by Monk
- + diff --git a/docs/docs/deploy-nginx/index.html b/docs/docs/deploy-nginx/index.html index acd4a3e9002..ad49fcc159e 100644 --- a/docs/docs/deploy-nginx/index.html +++ b/docs/docs/deploy-nginx/index.html @@ -8,7 +8,7 @@ 28.3 在 Nginx 部署 | Furion - + @@ -22,7 +22,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️
- + diff --git a/docs/docs/devops/index.html b/docs/docs/devops/index.html index c35d7954c3e..e41eb120937 100644 --- a/docs/docs/devops/index.html +++ b/docs/docs/devops/index.html @@ -8,7 +8,7 @@ 29.2 持续部署集成 | Furion - + @@ -22,7 +22,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️
- + diff --git a/docs/docs/donate/index.html b/docs/docs/donate/index.html index a0665bc46e7..746a2fa36e7 100644 --- a/docs/docs/donate/index.html +++ b/docs/docs/donate/index.html @@ -8,7 +8,7 @@ 1.5 赞助 Furion | Furion - + @@ -22,7 +22,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

1.5 赞助 Furion

如果想成为 Furion 支持者或赞助商,请考虑:

🍍 赞助列表#

注:排序按赞助顺序书写

赞助人昵称赞助金额(元)附语
🤴 爱吃油麦菜100感谢您的开源项目!
👳‍♂️ 麦壳饼200感谢您的开源项目!
👨 Sun100感谢您的开源项目!
👶 d61761720感谢您的开源项目!
👦 Diqiguoji00816.66见贤思齐
👲 nodyang100感谢您的开源项目!
👳‍♀️ mictxd100吹过的牛都实现。
🧓 欧流全10希望将来超越 Spring
👨‍⚕️ lionkon10...看了框架感觉拿来学习是很不错的...
😤 好人!10Nice 的小僧,我们的 dotnetchina 马上火起来了
😮 木木 Woody10感谢您的开源项目!
😚 Joker HouQQ 超级会员一个月
🤠 ccdfzQQ 专属红包 199
🌝 天夫李总支付宝 6666Furion 非常有意思,持续关注
😝 六尘子微信红包 199公司已经使用,小小敬意
🤠 ccdfzQQ 专属红包 200赞助一根内存条
🤑 邓亮灯28.88感谢您的开源项目!
😬 天道酬勤微信二维码 188小小心意
🥰 却月居士QQ 专属红包 100恭喜发财
🤩 鲁旭100感谢您的开源项目!
😬 散客行微信二维码 666终于找到一个不错的框架
😌 本心100项目功能很强大
🙆‍♂️ 毕业生100请你喝杯咖啡
🦹‍♀️ 猪鼻子微信二维码 668
🧟‍♂️ 明年·今日200使用的框架里最爽的,最理想的!加油
👨‍🎓 过去的过去50感谢您的开源项目!
👨‍🔧 万里兮100新公司的第一个项目从 Furion 开始
👴 Muphalem20很热心很亲切的开发者,加油!
💂‍♂️ 吃锅巴的码农微信二维码 500就冲你的文档写得好!
🤴 三重罗生门微信红包 200下次烤鱼你请!
🤵 李涛10加油,我们看到了 dotnet 美好的明天 :)
😂 !@#$%^&QQ 专属红包 100刚接触 furion,文档真棒
😵 李斌20看到一个不错的框架,学习学习,感谢作者的无私奉献
😞 逞强QQ 专属红包 20恭喜发财
🤒 顾锦松QQ 专属红包 200期待文档完成时候
🧟‍♀️ 哈哈微信赞赏码 1000点赞作者!
🍍 Z微信赞赏码 100恭喜孩子诞生,谢谢大佬
🍲 海涛50恭喜
😣 h微信赞赏码 100qq82683656
👱‍♀️ 冷大大微信赞赏码 100加快文档和教学补充哦,另外需要钉钉群,平常不用 QQ
👜 腾坤微信赞赏码 10感谢您的开源项目,QQ:565728589
🚆 文耶耶微信赞赏码 10很棒
🎟 Cynthiax微信转账 5000一路看着过来,小小心意
🥴 一花一世界微信赞赏码 10感谢开源,感谢持续更新
🥪 。微信赞赏码 2感谢
🎄微信赞赏码 20感谢你的开源项目
🍖 班卓微信赞赏码 9.9新年快乐
🥖 雨天裸奔的猫微信赞赏码 10加油!好东西,期待更多新特性
🍖 班卓微信赞赏码 9.9加个鸡腿
🍘 Egota Tiya微信赞赏码 6.66真的不错,准备使用这个框架
🤩 李氏天下微信赞赏码 200坚持下去
🎗 Trube微信赞赏码 200感恩
🧦 不长胡子的毛微信赞赏码 100Fur
👓 醉酒码农微信赞赏码 1000单次只能赞助 200,捐赠 5 次,支持 Furion
😢 XIUXIN微信赞赏码 20谢大佬,春天里的第一杯奶茶
👩‍🦳 吴鹏微信赞赏码 100感谢这么好的框架和文档
🧔 SymmmeeQQ 专属红包 20太牛了
🤴 隐居~~~QQ 专属红包 100支持一下吧
👵 饭粥微信赞赏码 666666666666
🎭 Free微信赞赏码 20感谢开源。比较敬业的架构师,支持一下
👑 时不待我微信赞赏码 50请你喝咖啡
😋 Eway5微信赞赏码 99找 abp 搜到 Furion 的,没想到国内有这么优秀的贡献者

非常感谢您们的支持,正是因为您们,中国开源才可以越走越远,Furion 越走越远。

Last updated on by 百小僧
- + diff --git a/docs/docs/dynamic-api-controller/index.html b/docs/docs/dynamic-api-controller/index.html index 67512bd766f..292c6af14b0 100644 --- a/docs/docs/dynamic-api-controller/index.html +++ b/docs/docs/dynamic-api-controller/index.html @@ -8,7 +8,7 @@ 5. 动态 WebAPI | Furion - + @@ -82,7 +82,7 @@
// 异常拦截
if(resultContext.Exception != null)
{
}
}
}

详细用法可参见 ASP.NET Core 5.0 - 筛选器

5.12 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by Monk
- + diff --git a/docs/docs/encryption/index.html b/docs/docs/encryption/index.html index fed55034927..9c355500cd0 100644 --- a/docs/docs/encryption/index.html +++ b/docs/docs/encryption/index.html @@ -8,7 +8,7 @@ 20. 数据加解密 | Furion - + @@ -28,7 +28,7 @@
// AES加解密
var s = "Furion".ToAESEncrypt("sfdsfdsfdsfdsfdsfdsfdsfdsfdfdsfdsfdfdfdfd");
var str = s.ToToAESDecrypt("sfdsfdsfdsfdsfdsfdsfdsfdsfdfdsfdsfdfdfdfd");
// DESC 加解密
var s = "Furion".ToDESCEncrypt("sfdsfdsfdsfdsfdsfdsfdsfdsfdfdsfdsfdfdfdfd");
var str = s.ToDESCDecrypt("sfdsfdsfdsfdsfdsfdsfdsfdsfdfdsfdsfdfdfdfd");

20.4 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by Monk
- + diff --git a/docs/docs/entity/index.html b/docs/docs/entity/index.html index b914d1ba87e..775c3bbc118 100644 --- a/docs/docs/entity/index.html +++ b/docs/docs/entity/index.html @@ -8,7 +8,7 @@ 9.3 数据库实体 | Furion - + @@ -48,7 +48,7 @@
// 配置数据库实体
public void Configure(EntityTypeBuilder<User> entityBuilder, DbContext dbContext, Type dbContextLocator)
{
entityBuilder.HasKey(u => u.Id);
entityBuilder.HasIndex(u => u.Name);
}
}
}

9.3.4.2 在任何实例类中配置#

using Furion.DatabaseAccessor;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using System;
namespace Furion.Core
{
public class SomeClass : IEntityTypeBuilder<User>
{
public void Configure(EntityTypeBuilder<User> entityBuilder, DbContext dbContext, Type dbContextLocator)
{
entityBuilder.HasKey(u => u.Id);
entityBuilder.HasIndex(u => u.Name);
}
}
}

如上面例子,通过 SomeClass 配置 User 数据库实体。

更多知识

如需了解实体配置支持哪些配置可查阅 【EFCore - 创建模型】 章节。

9.3.5 数据库实体配置说明#

Furion 框架会自动扫描所有继承 IEntity 接口的类进行 DbSet<TEntity> 注册,也就是实现自动配置 DbContextOnModelCreating

如果需要跳过自动注册,只需要贴 [NonAutomatic][SkipScan] 特性即可。一旦贴了此特性,那么就需要手动配置 DbContextOnModelCreating

9.3.6 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by 百小僧
- + diff --git a/docs/docs/event-bus/index.html b/docs/docs/event-bus/index.html index b72894b7f5c..d0be334ab2c 100644 --- a/docs/docs/event-bus/index.html +++ b/docs/docs/event-bus/index.html @@ -8,7 +8,7 @@ 22. 事件总线 | Furion - + @@ -24,7 +24,7 @@
// 多条消息共用同一个处理程序
[SubscribeMessage("delete:user")]
[SubscribeMessage("remove:user")]
public void RemoveUser(string eventId, object payload)
{
Console.WriteLine("我是"+eventId);
}
}

22.2.3 发布消息#

定义好订阅处理程序后,我们就可以在程序任何地方进行广播消息,事件总线会自动根据 消息 Id 触发对应的处理程序方法:

MessageCenter.Send("create:user", new User {}); // => 打印:我是create:user
MessageCenter.Send("delete:user", new User {}); // => 打印:我是delete:user
MessageCenter.Send("remove:user", new User {}); // => 打印:我是remove:user

22.2.4 直接订阅消息#

在上面的例子中,我们需要创建 ISubscribeHandler 的派生类进行相关配置才能实现订阅处理。

在某些特殊情况下,可能只需要订阅一次即可。所以,在 Furion 框架中,为了更简便的订阅消息,也提供了 MessageCenter.Subscribe<T> 静态方法,如:

MessageCenter.Subscribe<User>("create:user", (i,p) => {
// do something。。。
});

22.3 MediatR#

Furion 框架默认只实现了轻量级的事件总线机制,可能还远远未达到大型项目和高并发数据的处理需求。

这个时候,推荐使用 MediatR 这个第三方库进行处理,Github 地址:https://github.com/jbogard/MediatR

MediatR 是非常优秀的事件总线库,支持单播、多播、消息通知推送、智能调度等操作,非常小巧。

22.3.1 MediatR 使用文档#

https://github.com/jbogard/MediatR/wiki

22.4 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by Monk
- + diff --git a/docs/docs/friendly-exception/index.html b/docs/docs/friendly-exception/index.html index cb4659a5c07..36ee3084532 100644 --- a/docs/docs/friendly-exception/index.html +++ b/docs/docs/friendly-exception/index.html @@ -8,7 +8,7 @@ 7. 友好异常处理 | Furion - + @@ -60,7 +60,7 @@
namespace Furion.Application
{
public class LogExceptionHandler : IGlobalExceptionHandler, ISingleton
{
public Task OnExceptionAsync(ExceptionContext context)
{
// 写日志
return Task.CompletedTask;
}
}
}

7.15 FriendlyExceptionSettings 配置#

  • HideErrorCode:隐藏错误码,bool 类型,默认 false
  • DefaultErrorCode:默认错误码,string 类型
  • DefaultErrorMessage:默认错误消息,string 类型

配置示例

{
"FriendlyExceptionSettings": {
"DefaultErrorMessage": "系统异常,请联系管理员"
}
}

7.16 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by Monk
- + diff --git a/docs/docs/get-start/index.html b/docs/docs/get-start/index.html index 37e6c566946..d344f317513 100644 --- a/docs/docs/get-start/index.html +++ b/docs/docs/get-start/index.html @@ -8,7 +8,7 @@ 2.1 一分钟上手 | Furion - + @@ -33,7 +33,7 @@
// 添加这一行,如果是 MVC和API共存项目,无需添加 string.Empty
app.UseInject(string.Empty);
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
}
}
小提醒

如果 app.UseInject() 不输入参数,则默认地址为 /api,如果输入 string.Empty 则为 / 目录。如果输入任意字符串,则为 /任意字符串 目录。

2.4 启动浏览器#

启动浏览器查看效果。

说好一分钟上手,你们用了多长时间。😁

Last updated on by 百小僧
- + diff --git a/docs/docs/global/app/index.html b/docs/docs/global/app/index.html index 9046636b17f..713daab5eed 100644 --- a/docs/docs/global/app/index.html +++ b/docs/docs/global/app/index.html @@ -8,7 +8,7 @@ 1. App 静态类 | Furion - + @@ -31,7 +31,7 @@
// 获取进程架构
var processArchitecture = RuntimeInformation.ProcessArchitecture; // => X64
// 是否是64位操作系统
var is64BitOperatingSystem = Environment.Is64BitOperatingSystem; // => True
Last updated on by Monk
- + diff --git a/docs/docs/global/datavalidator/index.html b/docs/docs/global/datavalidator/index.html index 31c1cc5c0a2..c69e4a19b5a 100644 --- a/docs/docs/global/datavalidator/index.html +++ b/docs/docs/global/datavalidator/index.html @@ -8,7 +8,7 @@ 3. DataValidator 静态类 | Furion - + @@ -23,7 +23,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

3. DataValidator 静态类

3.1 验证对象数据#

var result = DataValidator.TryValidateObject(obj);

3.2 验证单个值#

var result = DataValidator.TryValidateValue(value, typeof(RequiredAttribure), typeof(RangeAttribute));

3.3 正则表达式验证单个值#

var result = DataValidator.TryValidateValue(value,"正则表达式");

3.4 验证类型验证单个值#

var result = DataValidator.TryValidateValue(value, ValidationTypes.Number);
var result2 = DataValidator.TryValidateValue(value, ValidationPattern.AllOfThem, ValidationTypes.Number, ValidationTypes.Required);
Last updated on by Monk
- + diff --git a/docs/docs/global/db/index.html b/docs/docs/global/db/index.html index b067cdfd9c7..6fc9367949f 100644 --- a/docs/docs/global/db/index.html +++ b/docs/docs/global/db/index.html @@ -8,7 +8,7 @@ 2. Db 静态类 | Furion - + @@ -22,7 +22,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

2. Db 静态类

2.1 获取非泛型仓储#

var repository = Db.GetRepository();

2.2 获取泛型仓储#

var entityRepository = Db.GetRepository<TEntity>();

2.3 获取带定位器泛型仓储#

var locatorRepository = Db.GetRepository<TEntity, TDbContextLocator>();

2.4 获取 Sql 仓储#

var sqlRepository = Db.GetSqlRepository();

2.5 获取 Sql 定位器仓储#

var sqlLocatorRepository = Db.GetSqlRepository<TDbContextLocator>();

2.6 获取 Sql 代理对象#

var sqlProxy= Db.GetSqlProxy<TSqlDispatchProxy>();

2.7 获取默认数据库上下文#

var dbContext = Db.GetDbContext();

2.7 获取定位器数据库上下文#

var locatorDbContext = Db.GetDbContext<TDbContextLocator>();
var locatorDbContext2 = Db.GetDbContext(typeof(TDbContextLocator));

2.8 创建新的默认数据库上下文#

var dbContext = Db.GetNewDbContext();

2.9 创建新的定位器数据库上下文#

var locatorDbContext = Db.GetNewDbContext<TDbContextLocator>();
var locatorDbContext2 = Db.GetNewDbContext(typeof(TDbContextLocator));
Last updated on by Monk
- + diff --git a/docs/docs/global/json/index.html b/docs/docs/global/json/index.html index 76f68376c31..729ccf16e65 100644 --- a/docs/docs/global/json/index.html +++ b/docs/docs/global/json/index.html @@ -8,7 +8,7 @@ 10. JSON 静态类 | Furion - + @@ -22,7 +22,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️
- + diff --git a/docs/docs/global/jsonserializer/index.html b/docs/docs/global/jsonserializer/index.html index 5cdd6a46b7f..7eddb1e58f9 100644 --- a/docs/docs/global/jsonserializer/index.html +++ b/docs/docs/global/jsonserializer/index.html @@ -8,7 +8,7 @@ 7. JsonSerializerUtility 静态类 | Furion - + @@ -22,7 +22,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

7. JsonSerializerUtility 静态类

重要声明

以下内容在 Furion 1.16.0 + 版本中已移除。请使用 【23. JSON 序列化章节】

7.1 序列化#

var str = JsonSerializerUtility.Serialize(obj, [options]);

7.3 反序列化#

var obj = JsonSerializerUtility.Deserialize<T>(str, [options]);

7.4 获取默认序列化配置#

var options = JsonSerializerUtility.GetDefaultJsonSerializerOptions();

7.5 设置序列化属性首字母大写#

services.AddControllersWithViews()
.AddJsonSerializerPascalPropertyNaming();

7.6 设置时间输出统一格式化#

services.AddControllersWithViews()
.AddDateTimeJsonConverter("yyyy-MM-dd HH:mm:ss");
Last updated on by Monk
- + diff --git a/docs/docs/global/l/index.html b/docs/docs/global/l/index.html index 3b2c0948c06..75fb8dce091 100644 --- a/docs/docs/global/l/index.html +++ b/docs/docs/global/l/index.html @@ -8,7 +8,7 @@ 8. L 静态类 | Furion - + @@ -22,7 +22,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

8. L 静态类

8.1 转换文本多语言#

var apiInterface = L.Text["API 接口"];

8.2 转换 Html 多语言#

var name = L.Html["<b>Hello</b><i> {0}</i>", name];

8.3 设置当前语言#

L.SetCulture("en-US");

8.4 获取系统语言列表#

var list = L.GetCultures();

8.5 获取当前选中语言#

var list = L.GetSelectCulture();
Last updated on by Monk
- + diff --git a/docs/docs/global/linqexpression/index.html b/docs/docs/global/linqexpression/index.html index d7fb795c3d1..280f5467d70 100644 --- a/docs/docs/global/linqexpression/index.html +++ b/docs/docs/global/linqexpression/index.html @@ -8,7 +8,7 @@ 5. LinqExpression 静态类 | Furion - + @@ -16,13 +16,15 @@ - +
-
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

5. LinqExpression 静态类

5.1 创建一个表达式#

var expression = LinqExpression.Create<T>(u => u.Id == 1);
var expression2 = LinqExpression.Create<T>((u,i) => u.Id ==1 && i > 0);

5.2 拼接两个表达式#

var expression = LinqExpression.And(expression1, expression2);
var expression2 = LinqExpression.IndexAnd(expression1, expression2);
var expression3 = LinqExpression.Or(expression2, expression3);
var expression4 = LinqExpression.IndexOr(expression2, expression3);
Last updated on by Monk
+
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

5. LinqExpression 静态类

5.1 创建一个表达式#

var expression = LinqExpression.Create<T>(u => u.Id == 1);
var expression2 = LinqExpression.Create<T>((u,i) => u.Id == 1 && i > 0);

5.2 拼接两个表达式#

// 创建一个初始化的表达式
var expression = LinqExpression.And();
var expression2 = LinqExpression.IndexAnd();
var expression3 = LinqExpression.Or();
var expression4 = LinqExpression.IndexOr();
+
// 拼接表达式
var expression5 = expression.Add(expression2);
var expression6 = expression.AddIf(age > 18, expression2);
var expression7 = expression.Or(expression2);
var expression8 = expression.OrIf(age > 18, expression2);
+
// 获取表达式属性名
var properyName = expression.GetExpressionPropertyName(u => u.Name); // Name
Last updated on by Monk
- + @@ -30,6 +32,6 @@ - + \ No newline at end of file diff --git a/docs/docs/global/messagecenter/index.html b/docs/docs/global/messagecenter/index.html index 88fc74e9570..c8ffd92952c 100644 --- a/docs/docs/global/messagecenter/index.html +++ b/docs/docs/global/messagecenter/index.html @@ -8,7 +8,7 @@ 9. MessageCenter 静态类 | Furion - + @@ -23,7 +23,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

9. MessageCenter 静态类

9.1 订阅消息#

MessageCenter.Subscribe<T>("messageId", (i,p) => {
});

9.2 发送消息#

MessageCenter.Send("messageId", new {});

9.3 取消订阅#

MessageCenter.Unsubscribe("messageId");
Last updated on by Monk
- + diff --git a/docs/docs/global/oops/index.html b/docs/docs/global/oops/index.html index de0e94396a8..1a2be8696d7 100644 --- a/docs/docs/global/oops/index.html +++ b/docs/docs/global/oops/index.html @@ -8,7 +8,7 @@ 4. Oops 静态类 | Furion - + @@ -22,7 +22,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

4. Oops 静态类

4.1 抛出字符串异常#

throw Oops.Oh("异常消息");
throw Oops.Oh("异常消息:{0}", "出错了");

4.2 指定类型的异常#

throw Oops.Oh("异常消息", typeof(ArgumentNullException));
throw Oops.Oh("异常消息:{0}", typeof(ArgumentNullException), "出错了");

4.3 状态码异常#

throw Oops.Oh(1000);
throw Oops.Oh(1000, "出错了");

4.4 状态码异常#

throw Oops.Oh(1000, typeof(ArgumentNullException));
throw Oops.Oh(1000, typeof(ArgumentNullException), "出错了");
Last updated on by Monk
- + diff --git a/docs/docs/global/shttp/index.html b/docs/docs/global/shttp/index.html index adfb13007f9..5e6df49de17 100644 --- a/docs/docs/global/shttp/index.html +++ b/docs/docs/global/shttp/index.html @@ -8,7 +8,7 @@ 6. Http 静态类 | Furion - + @@ -22,7 +22,7 @@ - + diff --git a/docs/docs/grpc/index.html b/docs/docs/grpc/index.html index 525c97c2b0c..50e4ffd59e7 100644 --- a/docs/docs/grpc/index.html +++ b/docs/docs/grpc/index.html @@ -8,7 +8,7 @@ 27. Grpc 服务 | Furion - + @@ -22,7 +22,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️
Last updated on by Monk
- + diff --git a/docs/docs/http/index.html b/docs/docs/http/index.html index b3c49f4e2fc..7396d045204 100644 --- a/docs/docs/http/index.html +++ b/docs/docs/http/index.html @@ -8,7 +8,7 @@ 19. 远程请求 | Furion - + @@ -88,7 +88,7 @@
// 配置 Facebook 基本信息
options.AddHttpClient("facebook", c =>
{
c.BaseAddress = new Uri("https://api.facebook.com/");
c.DefaultRequestHeaders.Add("Accept", "application/vnd.facebook.v3+json");
c.DefaultRequestHeaders.Add("User-Agent", "HttpClientFactory-Sample");
});
})

配置了命名客户端后,每次请求都会自动加上这些配置。

  • 代理请求 使用
[Get("api/getdata"), Client("github")]
Task<User> GetData();
[Put("api/getdata"), Client("facebook")]
Task<User> GetData();
  • 字符串拓展 使用
// 设置请求拦截
var response = await "http://47.100.247.61/api/sysdata/categories".SetClient("github").PostAsync();

19.7 关于同步请求#

Furion 框架内部默认不提供同步请求操作,建议总是使用异步的方式请求。如在不能使用异步的情况下,可自行转换为同步执行。

19.8 反馈与建议#

与我们交流

给 Furion 提 Issue


了解更多

想了解更多 HttpClient 知识可查阅 ASP.NET Core - HTTP 请求 章节

Last updated on by 树袋熊的树(Mars)
- + diff --git a/docs/docs/index.html b/docs/docs/index.html index 2e22977a4f6..74922989029 100644 --- a/docs/docs/index.html +++ b/docs/docs/index.html @@ -8,7 +8,7 @@ 1.1 介绍 | Furion - + @@ -22,7 +22,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

1.1 介绍

star fork GitHub stars GitHub forks GitHub license nuget

让 .NET 开发更简单,更通用,更流行。

💐 序言#

无私奉献不是天方夜谭,有时候,我们也可以做到。

🍕 名字的由来#

故事是这样子的:

自微软宣布 .NET 5 平台消息之后,就琢磨着开发一个基于 .NET 5 平台的开发框架,想做第一个吃 .NET 5 螃蟹尝鲜之人。

一开始想到了 Lazier 作为框架的名称,中文有 更懒 的意思。符合我的 “一切从简,只为了更懒” 的开发理念。

但是 更懒更烂 中文读音相近且没有特色,而且寓意也不是很好,对此换名问题苦恼了好些天。

刚好有一次在 QQ 群中无意间刷到了群友发的 “先知” 单词:Furion,就那一刻,就认定它了!

Furion 中文有 先知 的意思,恰好符合我创造框架的初衷。所以,Furion 就诞生了。

🍔 关于 LOGO#

Furion 标志设计理念是借鉴著名的 袋鼠理论 设计的。

袋鼠具有长腿、育袋、自我奔跑特点。

  • 长腿:代表着 Furion 拥有稳健的双腿,走在科技的前沿,走的更远,跑的更快。
  • 育袋:小育袋、大作为。期待 Furion 能够育孕出更多 .NET 优秀开发者和生机勃勃的生态。
  • 自我奔跑Furion 自身也要不断学习、不断进步、不断创新、不断开拓。

🍯 开源案例#

  • Admin.NET:基于 Furion 的通用权限管理平台。
  • 考试君:基于 Furion 的在线考试系统
  • 园丁:基于 Furion + Blazor 的超简单后台管理系统
  • Queer:基于 Furion + Layui 的通用型管理系统
  • Pear Admin:基于 Furion + PearAdmin 管理系统
  • JoyAdmin:基于 Furion + iviewadmin 开发的管理系统
  • YShop:基于 Furion + Vue 开发的移动电商项目

🍟 文档地址#

目前文档正在逐步完善中。

🥦 系列教程#

🌭 开源地址#

🍿 Docker 镜像#

  • Docker Hub 线上镜像
docker run --name furion -p 5000:80 monksoul/furion:v1.4.3
  • 手动 打包镜像

打开 CMD/Shell/PowerShell 进入 Furion 项目根目录打包 Furion 镜像:

docker build -t furion:v1.4.3 .

打包成功后,直接 docker run

docker run --name furion -p 5000:80 furion:v1.4.3

🥥 框架拓展包#

包类型名称版本描述
nugetFurionnugetFurion 核心包
nugetFurion.Extras.Authentication.JwtBearernugetFurion Jwt 拓展包
nugetFurion.Extras.DependencyModel.CodeAnalysisnugetFurion CodeAnalysis 拓展包
nugetFurion.Extras.Web.HttpContextnugetFurion HttpContext 拓展包
nugetFurion.Extras.ObjectMapper.MapsternugetFurion Mapster 拓展包
nugetFurion.Extras.DatabaseAccessor.SqlSugarnugetFurion SqlSugar 拓展包
nugetFurion.Extras.DatabaseAccessor.DappernugetFurion Dapper 拓展包
nugetFurion.Extras.Logging.SerilognugetFurion Serilog 拓展包

🍄 框架脚手架#

模板类型名称版本描述
nugetFurion.Template.MvcnugetMvc 模板
nugetFurion.Template.ApinugetWebApi 模板
nugetFurion.Template.AppnugetMvc/WebApi 模板
nugetFurion.Template.RazornugetRazorPages 模板
nugetFurion.Template.RazorWithWebApinugetRazorPages/WebApi 模板
nugetFurion.Template.BlazornugetBlazor 模板
nugetFurion.Template.BlazorWithWebApinugetBlazor/WebApi 模板

如何使用脚手架

🍎 框架特点#

  • 全新面貌:基于 .NET 5 平台,没有历史包袱
  • 极易入门:只需要一个 Inject() 即可完成配置
  • 极速开发:内置丰富的企业应用开发功能
  • 极少依赖:框架只依赖两个第三方包
  • 极其灵活:轻松面对多变复杂的需求
  • 极易维护:采用独特的架构思想,只为长久维护设计
  • 完整文档:提供完善的开发文档

🥞 架构设计#

正在整理中...

🥝 功能模块#

🥐 框架依赖#

Furion 为了追求极速入门,极致性能,尽可能的不使用或减少第三方依赖。目前 Furion 仅集成了以下两个依赖:

麻雀虽小五脏俱全。Furion 即使只集成了这两个依赖,但是主流的 依赖注入/控制反转AOP 面向切面编程,事件总线数据验证数据库操作 等等一个都不少。

🥗 环境要求#

  • Visual Studio 2019 16.8 +
  • .NET 5 SDK +
  • .Net Standard 2.1 +

🥪 支持平台#

  • 运行环境
    • Windows
    • Linux
    • MacOS
    • Docker/K8S/K3S/Rancher
    • Xamarin/MAUI
  • 数据库
    • SqlServer
    • Sqlite
    • Azure Cosmos
    • MySql
    • MariaDB
    • PostgreSQL
    • InMemoryDatabase
    • Oracle
    • Firebird
    • 达梦数据库
  • 应用部署
    • Kestrel
    • Nginx
    • Jexus
    • IIS
    • Apache
    • PM2
    • Supervisor
    • 单文件
    • 容器(Docker/K8S/K3S/Rancher)

🍖 关于性能#

Furion 目前采用 Visual Studio 2019 16.8 自带性能测试和 JMeter 进行测试,由于篇幅有限,只贴部分测试图,测试结果如下:


🌴 Stars 趋势图#

Stargazers over time

🍚 关于作者#

一个拥有近 13 年开发经验 .NETer。喜欢分享,喜欢新技术,在互联网多个技术领域皆有涉猎,MIP(dotNET China Most Influential Professional) 专家,同时多次获得开源中国 Gitee 授予 GVP 证书。

🍤 项目成员#

🎈 欢迎更多的开发者加入 Furion 大家庭。

🍝 他们都在用#

  • 百签科技(广东)有限公司
  • 码为科技(广州)有限公司
  • 夫上技术(阳江)有限公司
  • 广州启顺国际货运代理有限公司
  • 森丰供应链服务(广州)有限公司
  • 中山赢友网络科技有限公司
  • 中山模思软件科技有限公司
  • 珠海市恒泰新软件有限责任公司
  • 珠海思诺锐创软件有限公司
  • 深圳市易胜科技有限公司
  • 重庆虫儿飞科技有限公司
  • 重庆林木森科技有限公司
  • 深圳市品立方科技有限公司
  • 上海奥达科股份有限公司
  • 中山市泓升软件科技有限公司
  • 唐山天权建筑科技有限公司
  • 北京帝龙科技有限公司
  • 深圳市希立网络有限公司
  • 广州市飞帆计算机技术有限公司
  • 泉州市润海信息科技有限公司
  • 成都市彼岸里信息科技有限公司
  • 福建省山水生活服务集团有限公司
  • 安徽宝典网络科技有限公司
  • 西安空岛网络科技有限公司
  • 果糖大数据科技(南通)有限公司
  • 上海楷青信息技术有限公司
  • 上海邮银通信发展有限公司
  • 合纵动力软件科技有限公司
  • 深圳合纵动力软件科技有限公司
  • 北京帝龙科技有限公司

如果您的项目使用到 Furion 开发,可以告诉我们。

🍻 贡献代码#

Furion 遵循 Apache-2.0 开源协议,欢迎大家提交 PRIssue

如果要为项目做出贡献,请查看贡献指南

🍍 捐赠列表#

注:排序按捐赠顺序书写

捐赠人昵称捐赠金额(元)附语
🤴 爱吃油麦菜100感谢您的开源项目!
👳‍♂️ 麦壳饼200感谢您的开源项目!
👨 Sun100感谢您的开源项目!
👶 d61761720感谢您的开源项目!
👦 Diqiguoji00816.66见贤思齐
👲 nodyang100感谢您的开源项目!
👳‍♀️ mictxd100吹过的牛都实现。
🧓 欧流全10希望将来超越 Spring
👨‍⚕️ lionkon10...看了框架感觉拿来学习是很不错的...
😤 好人!10Nice 的小僧,我们的 dotnetchina 马上火起来了
😮 木木 Woody10感谢您的开源项目!
😚 Joker HouQQ 超级会员一个月
🤠 ccdfzQQ 专属红包 199
🌝 天夫李总支付宝 6666Furion 非常有意思,持续关注
😝 六尘子微信红包 199公司已经使用,小小敬意
🤠 ccdfzQQ 专属红包 200赞助一根内存条
🤑 邓亮灯28.88感谢您的开源项目!
😬 天道酬勤微信二维码 188小小心意
🥰 却月居士QQ 专属红包 100恭喜发财
🤩 鲁旭100感谢您的开源项目!
😬 散客行微信二维码 666终于找到一个不错的框架
😌 本心100项目功能很强大
🙆‍♂️ 毕业生100请你喝杯咖啡
🦹‍♀️ 猪鼻子微信二维码 668
🧟‍♂️ 明年·今日200使用的框架里最爽的,最理想的!加油
👨‍🎓 过去的过去50感谢您的开源项目!
👨‍🔧 万里兮100新公司的第一个项目从 Furion 开始
👴 Muphalem20很热心很亲切的开发者,加油!
💂‍♂️ 吃锅巴的码农微信二维码 500就冲你的文档写得好!
🤴 三重罗生门微信红包 200下次烤鱼你请!
🤵 李涛10加油,我们看到了 dotnet 美好的明天 :)
😂 !@#$%^&QQ 专属红包 100刚接触 furion,文档真棒
😵 李斌20看到一个不错的框架,学习学习,感谢作者的无私奉献
😞 逞强QQ 专属红包 20恭喜发财
🤒 顾锦松QQ 专属红包 200期待文档完成时候
🧟‍♀️ 哈哈微信赞赏码 1000点赞作者!
🍍 Z微信赞赏码 100恭喜孩子诞生,谢谢大佬
🍲 海涛50恭喜
😣 h微信赞赏码 100qq82683656
👱‍♀️ 冷大大微信赞赏码 100加快文档和教学补充哦,另外需要钉钉群,平常不用 QQ
👜 腾坤微信赞赏码 10感谢您的开源项目,QQ:565728589
🚆 文耶耶微信赞赏码 10很棒
🎟 Cynthiax微信转账 5000一路看着过来,小小心意
🥴 一花一世界微信赞赏码 10感谢开源,感谢持续更新
🥪 。微信赞赏码 2感谢
🎄微信赞赏码 20感谢你的开源项目
🍖 班卓微信赞赏码 9.9新年快乐
🥖 雨天裸奔的猫微信赞赏码 10加油!好东西,期待更多新特性
🍖 班卓微信赞赏码 9.9加个鸡腿
🍘 Egota Tiya微信赞赏码 6.66真的不错,准备使用这个框架
🤩 李氏天下微信赞赏码 200坚持下去
🎗 Trube微信赞赏码 200感恩
🧦 不长胡子的毛微信赞赏码 100Fur
👓 醉酒码农微信赞赏码 1000单次只能赞助 200,捐赠 5 次,支持 Furion
😢 XIUXIN微信赞赏码 20谢大佬,春天里的第一杯奶茶
👩‍🦳 吴鹏微信赞赏码 100感谢这么好的框架和文档
🧔 SymmmeeQQ 专属红包 20太牛了
🤴 隐居~~~QQ 专属红包 100支持一下吧
👵 饭粥微信赞赏码 666666666666
🎭 Free微信赞赏码 20感谢开源。比较敬业的架构师,支持一下
👑 时不待我微信赞赏码 50请你喝咖啡
😋 Eway5微信赞赏码 99找 abp 搜到 Furion 的,没想到国内有这么优秀的贡献者

非常感谢您们的支持,正是因为您们,中国开源才可以越走越远,Furion 越走越远。

如果想成为 Furion 支持者或赞助商,请考虑:

🥔 QQ 交流群#

dotNET 中国 ① 🥇(已满

dotNET 中国 ② 🥈(已满

dotNET 中国 ③(空余)

🧆 友情链接#

👉 Furion 👉 SqlSugar 👉 Layx 👉 t-io 👉 ThinkPHP 👉 Hutool 👉 BootstrapAdmin 👉 BootstrapBlazor 👉 IoTSharp 👉 Anno.Core 👉 WaterCloud 👉 OpenAuth.Net

🍵 特别鸣谢#

在这里特别感谢 QQ 网名:蓝狐星Furion 提供演示云服务器。

Last updated on by 百小僧
- + diff --git a/docs/docs/job/index.html b/docs/docs/job/index.html index c860e1e5ea8..7f8670654fd 100644 --- a/docs/docs/job/index.html +++ b/docs/docs/job/index.html @@ -8,7 +8,7 @@ 26. 任务调度 | Furion - + @@ -22,7 +22,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️
Last updated on by Monk
- + diff --git a/docs/docs/json-serialization/index.html b/docs/docs/json-serialization/index.html index 310963bc948..5ba084f3e63 100644 --- a/docs/docs/json-serialization/index.html +++ b/docs/docs/json-serialization/index.html @@ -8,7 +8,7 @@ 23. JSON 序列化 | Furion - + @@ -26,7 +26,7 @@
namespace Furion.Core
{
/// <summary>
/// Newtonsoft.Json 实现
/// </summary>
public class NewtonsoftJsonSerializerProvider : IJsonSerializerProvider, ISingleton
{
/// <summary>
/// 序列化对象
/// </summary>
/// <param name="value"></param>
/// <param name="jsonSerializerOptions"></param>
/// <returns></returns>
public string Serialize(object value, object jsonSerializerOptions = null)
{
return JsonConvert.SerializeObject(value, jsonSerializerOptions as JsonSerializerSettings);
}
/// <summary>
/// 反序列化字符串
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="json"></param>
/// <param name="jsonSerializerOptions"></param>
/// <returns></returns>
public T Deserialize<T>(string json, object jsonSerializerOptions = null)
{
return JsonConvert.DeserializeObject<T>(json, jsonSerializerOptions as JsonSerializerSettings);
}
}
}

23.5.2 序列化属性名大写#

  • System.Text.Json 方式
services.AddControllersWithViews()
.AddJsonOptions(options => {
options.JsonSerializerOptions.PropertyNamingPolicy = null;
});
  • Newtonsoft.Json 方式
services.AddControllersWithViews()
.AddNewtonsoftJson(options =>
{
options.SerializerSettings.ContractResolver = new DefaultContractResolver();
});
特别注意

采用 Newtonsoft.Json 方式接口返回值能够正常输出,但是 Swagger 界面中的 Example Values 依然显示小写字母开头的属性,这时只需要再添加 System.Text.Json 配置即可,如:

.AddJsonOptions(options => {
options.JsonSerializerOptions.PropertyNamingPolicy = null;
});

主要原因是 Swagger 拓展包底层依赖了 System.Text.Json

23.5.3 时间格式化#

  • System.Text.Json 方式
services.AddControllersWithViews()
.AddJsonOptions(options =>
{
options.JsonSerializerOptions.Converters.AddDateFormatString("yyyy-MM-dd HH:mm:ss");
});

需引用 System.Text.Json 命名空间。

  • Newtonsoft.Json 方式
services.AddControllersWithViews()
.AddNewtonsoftJson(options =>
{
options.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss";
});

23.5.4 忽略循环引用#

  • System.Text.Json 方式
services.AddControllersWithViews()
.AddJsonOptions(options =>
{
options.JsonSerializerOptions.ReferenceHandler = ReferenceHandler.IgnoreCycles;
});
特别说明

.NET 5 中,System.Text.Json 并不支持处理循环引用问题,以上的解决方案只限用于 .NET 6 Preview 2+。😂

需引用 System.Text.Json 命名空间。

  • Newtonsoft.Json 方式
services.AddControllersWithViews()
.AddNewtonsoftJson(options =>
{
options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
});

23.6 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by Monk
- + diff --git a/docs/docs/local-language/index.html b/docs/docs/local-language/index.html index 5e39a06a631..e6dd126cb8a 100644 --- a/docs/docs/local-language/index.html +++ b/docs/docs/local-language/index.html @@ -8,7 +8,7 @@ 21. 全球化和本地化 | Furion - + @@ -31,7 +31,7 @@
public TestController(IStringLocalizerFactory factory)
{
_localizer = factory.Create(L.LangType);
}
public IActionResult About()
{
ViewData["Message"] = _localizer["Your application description page."];
}
}

21.9 LocalizationSettings 配置#

  • LocalizationSettings 多语言配置根节点
    • ResourcesPath:资源目录,string 类型,默认 Resources
    • SupportedCultures:支持的语言区域码类别,string[] 类型
    • DefaultCulture:默认语言区域码,如果为空,则取 SupportedCultures 第一项

21.10 区域码列表#

  • af 公用荷兰语
  • af-ZA 公用荷兰语 - 南非
  • sq 阿尔巴尼亚
  • sq-AL 阿尔巴尼亚 -阿尔巴尼亚
  • ar 阿拉伯语
  • ar-DZ 阿拉伯语 -阿尔及利亚
  • ar-BH 阿拉伯语 -巴林
  • ar-EG 阿拉伯语 -埃及
  • ar-IQ 阿拉伯语 -伊拉克
  • ar-JO 阿拉伯语 -约旦
  • ar-KW 阿拉伯语 -科威特
  • ar-LB 阿拉伯语 -黎巴嫩
  • ar-LY 阿拉伯语 -利比亚
  • ar-MA 阿拉伯语 -摩洛哥
  • ar-OM 阿拉伯语 -阿曼
  • ar-QA 阿拉伯语 -卡塔尔
  • ar-SA 阿拉伯语 - 沙特阿拉伯
  • ar-SY 阿拉伯语 -叙利亚共和国
  • ar-TN 阿拉伯语 -北非的共和国
  • ar-AE 阿拉伯语 - 阿拉伯联合酋长国
  • ar-YE 阿拉伯语 -也门
  • hy 亚美尼亚
  • hy-AM 亚美尼亚的 -亚美尼亚
  • az Azeri
  • az-AZ-Cyrl Azeri-(西里尔字母的) 阿塞拜疆
  • az-AZ-Latn Azeri(拉丁文)- 阿塞拜疆
  • eu 巴斯克
  • eu-ES 巴斯克 -巴斯克
  • be Belarusian
  • be-BY Belarusian-白俄罗斯
  • bg 保加利亚
  • bg-BG 保加利亚 -保加利亚
  • ca 嘉泰罗尼亚
  • ca-ES 嘉泰罗尼亚 -嘉泰罗尼亚
  • zh-HK 华 - 香港的 SAR
  • zh-MO 华 - 澳门的 SAR
  • zh-CN 华 -中国
  • zh-CHS 华 (单一化)
  • zh-SG 华 -新加坡
  • zh-TW 华 -台湾
  • zh-CHT 华 (传统的)
  • hr 克罗埃西亚
  • hr-HR 克罗埃西亚 -克罗埃西亚
  • cs 捷克
  • cs-CZ 捷克 - 捷克
  • da 丹麦文
  • da-DK 丹麦文 -丹麦
  • div Dhivehi
  • div-MV Dhivehi-马尔代夫
  • nl 荷兰
  • nl-BE 荷兰 -比利时
  • nl-NL 荷兰 - 荷兰
  • en 英国
  • en-AU 英国 -澳洲
  • en-BZ 英国 -伯利兹
  • en-CA 英国 -加拿大
  • en-CB 英国 -加勒比海
  • en-IE 英国 -爱尔兰
  • en-JM 英国 -牙买加
  • en-NZ 英国 - 新西兰
  • en-PH 英国 -菲律宾共和国
  • en-ZA 英国 - 南非
  • en-TT 英国 - 千里达托贝哥共和国
  • en-GB 英国 - 英国
  • en-US 英国 - 美国
  • en-ZW 英国 -津巴布韦
  • et 爱沙尼亚
  • et-EE 爱沙尼亚的 -爱沙尼亚
  • fo Faroese
  • fo-FO Faroese- 法罗群岛
  • fa 波斯语
  • fa-IR 波斯语 -伊朗王国
  • fi 芬兰语
  • fi-FI 芬兰语 -芬兰
  • fr 法国
  • fr-BE 法国 -比利时
  • fr-CA 法国 -加拿大
  • fr-FR 法国 -法国
  • fr-LU 法国 -卢森堡
  • fr-MC 法国 -摩纳哥
  • fr-CH 法国 -瑞士
  • gl 加利西亚
  • gl-ES 加利西亚 -加利西亚
  • ka 格鲁吉亚州
  • ka-GE 格鲁吉亚州 -格鲁吉亚州
  • de 德国
  • de-AT 德国 -奥地利
  • de-DE 德国 -德国
  • de-LI 德国 -列支敦士登
  • de-LU 德国 -卢森堡
  • de-CH 德国 -瑞士
  • el 希腊
  • el-GR 希腊 -希腊
  • gu Gujarati
  • gu-IN Gujarati-印度
  • he 希伯来
  • he-IL 希伯来 -以色列
  • hi 北印度语
  • hi-IN 北印度的 -印度
  • hu 匈牙利
  • hu-HU 匈牙利的 -匈牙利
  • is 冰岛语
  • is-IS 冰岛的 -冰岛
  • id 印尼
  • id-ID 印尼 -印尼
  • it 意大利
  • it-IT 意大利 -意大利
  • it-CH 意大利 -瑞士
  • ja 日本
  • ja-JP 日本 -日本
  • kn 卡纳达语
  • kn-IN 卡纳达语 -印度
  • kk Kazakh
  • kk-KZ Kazakh-哈萨克
  • kok Konkani
  • kok-IN Konkani-印度
  • ko 韩国
  • ko-KR 韩国 -韩国
  • ky Kyrgyz
  • ky-KZ Kyrgyz-哈萨克
  • lv 拉脱维亚
  • lv-LV 拉脱维亚的 -拉脱维亚
  • lt 立陶宛
  • lt-LT 立陶宛 -立陶宛
  • mk 马其顿
  • mk-MK 马其顿 -FYROM
  • ms 马来
  • ms-BN 马来 -汶莱
  • ms-MY 马来 -马来西亚
  • mr 马拉地语
  • mr-IN 马拉地语 -印度
  • mn 蒙古
  • mn-MN 蒙古 -蒙古
  • no 挪威
  • nb-NO 挪威 (Bokm?l) - 挪威
  • nn-NO 挪威 (Nynorsk)- 挪威
  • pl 波兰
  • pl-PL 波兰 -波兰
  • pt 葡萄牙
  • pt-BR 葡萄牙 -巴西
  • pt-PT 葡萄牙 -葡萄牙
  • pa Punjab 语
  • pa-IN Punjab 语 -印度
  • ro 罗马尼亚语
  • ro-RO 罗马尼亚语 -罗马尼亚
  • ru 俄国
  • ru-RU 俄国 -俄国
  • sa 梵文
  • sa-IN 梵文 -印度
  • sr-SP-Cyrl 塞尔维亚 -(西里尔字母的) 塞尔维亚共和国
  • sr-SP-Latn 塞尔维亚 (拉丁文)- 塞尔维亚共和国
  • sk 斯洛伐克
  • sk-SK 斯洛伐克 -斯洛伐克
  • sl 斯洛文尼亚
  • sl-SI 斯洛文尼亚 -斯洛文尼亚
  • es 西班牙
  • es-AR 西班牙 -阿根廷
  • es-BO 西班牙 -玻利维亚
  • es-CL 西班牙 -智利
  • es-CO 西班牙 -哥伦比亚
  • es-CR 西班牙 - 哥斯达黎加
  • es-DO 西班牙 - 多米尼加共和国
  • es-EC 西班牙 -厄瓜多尔
  • es-SV 西班牙 - 萨尔瓦多
  • es-GT 西班牙 -危地马拉
  • es-HN 西班牙 -洪都拉斯
  • es-MX 西班牙 -墨西哥
  • es-NI 西班牙 -尼加拉瓜
  • es-PA 西班牙 -巴拿马
  • es-PY 西班牙 -巴拉圭
  • es-PE 西班牙 -秘鲁
  • es-PR 西班牙 - 波多黎各
  • es-ES 西班牙 -西班牙
  • es-UY 西班牙 -乌拉圭
  • es-VE 西班牙 -委内瑞拉
  • sw Swahili
  • sw-KE Swahili-肯尼亚
  • sv 瑞典
  • sv-FI 瑞典 -芬兰
  • sv-SE 瑞典 -瑞典
  • syr Syriac
  • syr-SY Syriac-叙利亚共和国
  • ta 坦米尔
  • ta-IN 坦米尔 -印度
  • tt Tatar
  • tt-RU Tatar-俄国
  • te Telugu
  • te-IN Telugu-印度
  • th 泰国
  • th-TH 泰国 -泰国
  • tr 土耳其语
  • tr-TR 土耳其语 -土耳其
  • uk 乌克兰
  • uk-UA 乌克兰 -乌克兰
  • ur Urdu
  • ur-PK Urdu-巴基斯坦
  • uz Uzbek
  • uz-UZ-Cyrl Uzbek-(西里尔字母的) 乌兹别克斯坦
  • uz-UZ-Latn Uzbek(拉丁文)- 乌兹别克斯坦
  • vi 越南
  • vi-VN 越南 -越南

21.11 反馈与建议#

与我们交流

给 Furion 提 Issue


了解更多

想了解更多 多语言 知识可查阅 ASP.NET Core - 全局化和本地化 章节。

Last updated on by Monk
- + diff --git a/docs/docs/logging/index.html b/docs/docs/logging/index.html index fa47dcf8664..7cffba276db 100644 --- a/docs/docs/logging/index.html +++ b/docs/docs/logging/index.html @@ -8,7 +8,7 @@ 18. 日志记录 | Furion - + @@ -30,7 +30,7 @@
namespace Furion.Web.Entry
{
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args)
{
return Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.Inject()
.UseStartup<Startup>();
})
.UseSerilogDefault();
}
}
}
特别注意

.UseSerilogDefault() 默认集成了 控制台文件 方式。如需自定义写入,则传入需要写入的介质即可:

.UseSerilogDefault(config =>
{
config.WriteTo.Console(outputTemplate: "[{Timestamp:HH:mm:ss} {Level:u3}] {Message:lj} {Properties:j}{NewLine}{Exception}")
.WriteTo.File("log.txt", rollingInterval: RollingInterval.Day, rollOnFileSizeLimit: true);
});
  • 替换 appsetting.json 默认日志内容
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information",
"Microsoft.EntityFrameworkCore": "Information"
}
}

替换为:

"Serilog": {
"MinimumLevel": {
"Default": "Information",
"Override": {
"System": "Warning",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information",
"Microsoft.EntityFrameworkCore": "Information"
}
}
}

18.5.2 记录请求日志#

Serilog 日志组件也提供了非常方便快捷的请求日志中间件,只需要在 Startup.cs 中启用即可。如:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseStaticFiles();
app.UseSerilogRequestLogging(); // 必须在 UseStaticFiles 和 UseRouting 之间
app.UseRouting();
}

18.6 日志示例#

下面便是日志输出日志的模板,支持各种自定义方式

2020-12-21 15:54:43.775 +08:00 [INF] Application started. Press Ctrl+C to shut down.
2020-12-21 15:54:43.897 +08:00 [INF] Hosting environment: Development
2020-12-21 15:54:43.899 +08:00 [INF] Content root path: D:\MONK\Furion\samples\Furion.Web.Entry
2020-12-21 15:55:00.651 +08:00 [WRN] Sensitive data logging is enabled. Log entries and exception messages may include sensitive application data; this mode should only be enabled during development.
2020-12-21 15:55:00.817 +08:00 [INF] Entity Framework Core 5.0.1 initialized 'DefaultDbContext' using provider 'Microsoft.EntityFrameworkCore.Sqlite' with options: SensitiveDataLoggingEnabled DetailedErrorsEnabled MaxPoolSize=100 MigrationsAssembly=Furion.Database.Migrations
2020-12-21 15:55:01.711 +08:00 [WRN] Compiling a query which loads related collections for more than one collection navigation either via 'Include' or through projection but no 'QuerySplittingBehavior' has been configured. By default Entity Framework will use 'QuerySplittingBehavior.SingleQuery' which can potentially result in slow query performance. See https://go.microsoft.com/fwlink/?linkid=2134277 for more information. To identify the query that's triggering this warning call 'ConfigureWarnings(w => w.Throw(RelationalEventId.MultipleCollectionIncludeWarning))'
2020-12-21 15:55:01.919 +08:00 [INF] Executed DbCommand (31ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30']
SELECT "p"."Id", "p"."Name", "p"."Age", "p"."Address", "p0"."PhoneNumber", "p0"."QQ", "p"."CreatedTime", "p0"."Id", "c"."Id", "c"."Name", "c"."Gender", "t"."Id", "t"."Name", "t"."PersonsId", "t"."PostsId"
FROM "Person" AS "p"
LEFT JOIN "PersonDetail" AS "p0" ON "p"."Id" = "p0"."PersonId"
LEFT JOIN "Children" AS "c" ON "p"."Id" = "c"."PersonId"
LEFT JOIN (
SELECT "p2"."Id", "p2"."Name", "p1"."PersonsId", "p1"."PostsId"
FROM "PersonPost" AS "p1"
INNER JOIN "Post" AS "p2" ON "p1"."PostsId" = "p2"."Id"
) AS "t" ON "p"."Id" = "t"."PersonsId"
ORDER BY "p"."Id", "p0"."Id", "c"."Id", "t"."PersonsId", "t"."PostsId", "t"."Id"
2020-12-21 15:55:25.354 +08:00 [INF] Executed DbCommand (3ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30']
SELECT "p"."Id", "p"."Name", "p"."Age", "p"."Address", "p0"."PhoneNumber", "p0"."QQ", "p"."CreatedTime", "p0"."Id", "c"."Id", "c"."Name", "c"."Gender", "t"."Id", "t"."Name", "t"."PersonsId", "t"."PostsId"
FROM "Person" AS "p"
LEFT JOIN "PersonDetail" AS "p0" ON "p"."Id" = "p0"."PersonId"
LEFT JOIN "Children" AS "c" ON "p"."Id" = "c"."PersonId"
LEFT JOIN (
SELECT "p2"."Id", "p2"."Name", "p1"."PersonsId", "p1"."PostsId"
FROM "PersonPost" AS "p1"
INNER JOIN "Post" AS "p2" ON "p1"."PostsId" = "p2"."Id"
) AS "t" ON "p"."Id" = "t"."PersonsId"
ORDER BY "p"."Id", "p0"."Id", "c"."Id", "t"."PersonsId", "t"."PostsId", "t"."Id"
2020-12-21 15:58:27.328 +08:00 [INF] Application started. Press Ctrl+C to shut down.
2020-12-21 15:58:27.442 +08:00 [INF] Hosting environment: Development
2020-12-21 15:58:27.444 +08:00 [INF] Content root path: D:\MONK\Furion\samples\Furion.Web.Entry
2020-12-21 15:58:27.909 +08:00 [INF] HTTP GET / responded 200 in 457.0657 ms
2020-12-21 15:58:33.336 +08:00 [INF] HTTP GET /api/index.html responded 200 in 95.9277 ms
2020-12-21 15:58:34.187 +08:00 [INF] HTTP GET /swagger/Default/swagger.json responded 200 in 674.9800 ms

18.7 打印日志到 Swagger#

Furion 框架中默认集成了 MiniProfiler 组件并与 Swagger 进行了结合,如需打印日志或调试代码,只需调用以下方法即可:

App.PrintToMiniProfiler("分类", "状态", "要打印的消息");

18.9 反馈与建议#

与我们交流

给 Furion 提 Issue


了解更多

想了解更多 日志 知识可查阅 ASP.NET Core - 日志 章节 和 Serilog 文档。

Last updated on by Monk
- + diff --git a/docs/docs/object-mapper/index.html b/docs/docs/object-mapper/index.html index dce9379c7fc..7ef8f871b76 100644 --- a/docs/docs/object-mapper/index.html +++ b/docs/docs/object-mapper/index.html @@ -8,7 +8,7 @@ 13. 对象数据映射 | Furion - + @@ -24,7 +24,7 @@
var dto = new Dto();
dto.Id = entity.Id;
dto.Name = entity.Name;
dto.Age = entity.Age;
dto.Address = entity.Address;
dto.FullName = entity.FirstName + entity.LastName;
dto.IdCard = entity.IdCard.Replace("1234", "****");

上面的例子似乎没有任何问题,但是如果很多地方需要这样的赋值操作、或者相同的赋值操作在多个地方使用,又或者一个类中含有非常多的属性或自定义赋值操作。那么这样的操作效率极低,容易出错,且代码非常臃肿和冗余。

所以,实现自动映射赋值和支持特殊配置的需求就有了。目前 C# 平台有两个优秀的对象映射工具:MapsterAutoMapperFurion 框架中,推荐使用 MapsterMapster 是一款极易使用且超高性能的对象映射框架。

13.3 Mapster 使用#

现在,我们可以通过 Mapster 提供的对象映射方法:Adapt 方法改造上面的例子:

安装拓展包

Furion.Core 层安装 Furion.Extras.ObjectMapper.Mapster 拓展包,无需手动调用,Furion 会自动加载并调用。

13.3.1 快速入门#

var entity = repository.Find(1);
var dto = entity.Adapt<Dto>();

仅仅一行代码就可以实现 entity -> dto 的转换,如果涉及到赋值的复制操作,如 dto.FullNamedto.IdCard,我们只需要自定义映射规则类即可。

13.3.2 自定义映射规则#

using Mapster;
using System;
namespace Furion.Application
{
public class Mapper : IRegister
{
public void Register(TypeAdapterConfig config)
{
config.ForType<Entity, Dto>()
.Map(dest => dest.FullName, src => src.FirstName + src.LastName)
.Map(dest => dest.IdCard, src => src.IdCard.Replace("1234", "****"));
}
}
}
小知识

该映射文件 Mapper.cs 可以放在任何项目或文件夹中,Furion 会在程序启动的时候自动扫描并注入配置。

13.3.3 依赖注入方式#

Mapster 除了提供 Adapt 拓展方法以外,同时还提供依赖注入的方式。

public Person(IMapper mapper)
{
var dto = _mapper.Map<Dto>(entity);
}

13.3.4 和 EFCore 配合#

Mapster 还提供了 ProjectToType Linq 拓展方法减少我们手动 Select 操作,如:

正常的操作:

var destinations = context.Sources
.Select(c => new Destination {
Id = p.Id,
Name = p.Name,
Surname = p.Surname,
....
})
.ToList();

使用 Mapster 之后:

var destinations = context.Sources.ProjectToType<Destination>().ToList();

13.5 全局默认配置#

Furion 提供全局默认映射配置选项 TypeAdapterConfig.GlobalSettings.Default,可在 Startup 中配置即可,如:

TypeAdapterConfig.GlobalSettings.Default
.PreserveReference(true);

13.6 反馈与建议#

与我们交流

给 Furion 提 Issue


了解更多

想了解更多 Mapster 知识可查阅 Mapster - Wiki 文档。

Last updated on by Monk
- + diff --git a/docs/docs/options/index.html b/docs/docs/options/index.html index 67cc528b055..a71f4796cb5 100644 --- a/docs/docs/options/index.html +++ b/docs/docs/options/index.html @@ -8,7 +8,7 @@ 4.2 选项 | Furion - + @@ -52,7 +52,7 @@
public void OnListener(AppInfoOptions options, IConfiguration configuration)
{
var name = options.Name; // 实时的最新值
var version = options.Version; // 实时的最新值
}
public void PostConfigure(AppInfoOptions options, IConfiguration configuration)
{
}
}
特别说明

IConfigurableOptionsListener<TOptions> 继承自 IConfigurableOptions<TOptions>

4.2.10 选项的优缺点#

  • 优点

    • 强类型配置
    • 提供多种读取方式
    • 支持热加载
    • 支持设置默认值/后期配置
    • 支持在运行环境中动态配置
    • 支持验证配置有效性
    • 支持更改通知
    • 支持命名选项
  • 缺点

    • 需要定义对应类型
    • 需要在启动时注册

4.2.11 反馈与建议#

与我们交流

给 Furion 提 Issue


了解更多

想了解更多 选项 知识可查阅 ASP.NET Core - 选项 章节。

Last updated on by 百小僧
- + diff --git a/docs/docs/performance/index.html b/docs/docs/performance/index.html index 8d875b8fc78..66f012578a7 100644 --- a/docs/docs/performance/index.html +++ b/docs/docs/performance/index.html @@ -8,7 +8,7 @@ 29.2 性能测试 | Furion - + @@ -22,7 +22,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️
Last updated on by Monk
- + diff --git a/docs/docs/process-service/index.html b/docs/docs/process-service/index.html index 1da7020937f..03ba7c6bbe9 100644 --- a/docs/docs/process-service/index.html +++ b/docs/docs/process-service/index.html @@ -8,7 +8,7 @@ 25. 辅助角色服务 | Furion - + @@ -22,7 +22,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️
Last updated on by Monk
- + diff --git a/docs/docs/reference/index.html b/docs/docs/reference/index.html index 0c1b7c84d83..1baba46bd2e 100644 --- a/docs/docs/reference/index.html +++ b/docs/docs/reference/index.html @@ -8,7 +8,7 @@ 2.3 手动搭建分层 | Furion - + @@ -24,7 +24,7 @@
namespace YourName.Web.Entry
{
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args)
{
return Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.Inject()
.UseStartup<Startup>();
});
}
}
}

2.3.3 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by sourcehome
- + diff --git a/docs/docs/saas/index.html b/docs/docs/saas/index.html index 7a2de581163..5a86832fc6c 100644 --- a/docs/docs/saas/index.html +++ b/docs/docs/saas/index.html @@ -8,7 +8,7 @@ 11. SaaS 多租户 | Furion - + @@ -60,7 +60,7 @@
public string Host { get; set; }
}
}

如果需要查询该租户信息,可通过以下代码获取,如:

var tenantDbContext = Db.GetDbContext<MultiTenantDbContextLocator>();
var myTenant = tenantDbContext.Set<MyTenant>();

11.9 刷新租户缓存#

Furion 框架会在租户上下文第一次查询时候将租户表缓存起来,避免频发查询数据库,如果更新了租户表,则需要手动刷新租户信息,如:

using Furion.DatabaseAccessor.Extensions;
// 在更新租户信息后调用
_repository.Context.RefreshTenantCache();

11.10 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by Monk
- + diff --git a/docs/docs/settings/appsettings/index.html b/docs/docs/settings/appsettings/index.html index b9227b08d59..04abdef9a0a 100644 --- a/docs/docs/settings/appsettings/index.html +++ b/docs/docs/settings/appsettings/index.html @@ -8,7 +8,7 @@ 1. 应用配置 | Furion - + @@ -22,7 +22,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

1. 应用配置

1.1 关于配置#

应用配置指的是 Furion 框架全局配置选项。

1.2 配置信息#

  • AppSettings:配置根节点
    • InjectMiniProfiler:是否注入 MiniProfilerbool 类型,默认 true关闭 Swagger 左上角监听
    • InjectSpecificationDocument:是否启用 Swagger 文档,bool 类型,默认 true生产环境可关闭
    • EnabledReferenceAssemblyScan:是否启用通过 dll 方式添加的引用程序集扫描,bool 类型,默认 false
    • ExternalAssemblies:配置外部程序集完整路径,支持动态加载,string[] 类型,默认 []
    • DynamicLogLevel:配置动态日志级别,LogLevel 枚举类型,默认 LogLevel.Information
    • PrintDbConnectionInfo:是否打印数据库连接信息到 MiniProfiler 中,bool 类型,默认 true

1.3 配置示例#

{
"AppSettings": {
"InjectMiniProfiler": false
}
}

1.4 特别注意#

默认情况下,Furion 框架会自动扫描 *.json*.config.xml 文件载入配置中,如需忽略个别文件,需在 appsettings.json 配置文件根节点下配置 IgnoreConfigurationFiles 节点即可,string[] 类型,如:

{
"IgnoreConfigurationFiles": ["runtime.json"]
}

必须在 appsettings.json 文件中配置才有效

Last updated on by 百小僧
- + diff --git a/docs/docs/settings/corsaccessorsettings/index.html b/docs/docs/settings/corsaccessorsettings/index.html index 611c9b5671d..7852ba94b77 100644 --- a/docs/docs/settings/corsaccessorsettings/index.html +++ b/docs/docs/settings/corsaccessorsettings/index.html @@ -8,7 +8,7 @@ 2. 跨域配置 | Furion - + @@ -22,7 +22,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

2. 跨域配置

2.1 关于配置#

跨域配置指的是 Furion 框架客户端跨域配置选项。

2.2 配置信息#

  • CorsAccessorSettings:配置根节点
    • PolicyName:跨域策略名,sting 类型,必填,默认 FurCorsAccessor
    • WithOrigins:允许跨域的域名列表,string[] 类型,默认 [ "http://localhost:4200" ]
    • WithHeaders:请求表头,没有配置则允许所有表头,string[] 类型
    • WithExposedHeaders:响应标头,string[] 类型
    • WithMethods:设置跨域允许请求谓词,没有配置则允许所有,string[] 类型
    • AllowCredentials:跨域请求中的凭据,bool 类型
    • SetPreflightMaxAge:设置预检过期时间,int 类型

2.3 配置示例#

{
"CorsAccessorSettings": {
"PolicyName": "MyPolicy",
"WithOrigins": ["http://localhost:4200", "https://furion.pro"]
}
}

2.4 使用 axios 前端注意事项#

由于 axios 对跨域有特定的需要,需要响应报文中添加特定 Header 才能放行,如:Access-Control-Expose-Headers: xxxxx,所以,如果前端使用了 axios 请求,需要添加以下配置:

{
"CorsAccessorSettings": {
"WithExposedHeaders": ["X-Pagination","access-token","x-access-token"]
}
}
Last updated on by Monk
- + diff --git a/docs/docs/settings/dependencyinjectionsettings/index.html b/docs/docs/settings/dependencyinjectionsettings/index.html index b5e9605bda1..4950f12fef8 100644 --- a/docs/docs/settings/dependencyinjectionsettings/index.html +++ b/docs/docs/settings/dependencyinjectionsettings/index.html @@ -8,7 +8,7 @@ 4. 依赖注入配置 | Furion - + @@ -22,7 +22,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

4. 依赖注入配置

4.1 关于配置#

依赖注入配置指的是 Furion 框架依赖注入配置选项。

4.2 配置信息#

  • DependencyInjectionSettings:依赖注入配置根节点
    • Definitions:动态依赖注入配置节点,ExternalService 数组类型
      • ExternalService:配置单个依赖注入信息
        • Interface:配置依赖接口信息,格式:程序集名称;接口完整名称,如:Furion.Application;Furion.Application.ITestService
        • Service:配置接口实现信息,格式同上
        • RegisterType:配置依赖注入的对象生存期,取值:TransientScopedSingleton
        • Action:注册行为,可选值:AddTryAdd,参见 依赖注入-特性配置
        • Pattern:注册选项,参见 依赖注入-特性配置置
        • Named:注册别名,参见 依赖注入-特性配置
        • Order:注册排序,参见 依赖注入-特性配置
        • Proxy:配置代理拦截,格式:程序集名称;代理类完整名称,参见 依赖注入-特性配置

4.3 配置示例#

{
"DependencyInjectionSettings": {
"Definitions": [
{
"Interface": "Furion.Application;Furion.Application.ITestService",
"Service": "Furion.Application;Furion.Application.TestService",
"RegisterType": "Transient",
"Action": "Add",
"Pattern": "SelfWithFirstInterface",
"Named": "TestService",
"Order": 1,
"Proxy": "Furion.Application;Furion.Application.LogDispathProxy"
}
]
}
}
Last updated on by sourcehome
- + diff --git a/docs/docs/settings/dynamicapicontrollersettings/index.html b/docs/docs/settings/dynamicapicontrollersettings/index.html index f460222249a..93f1ab1ee54 100644 --- a/docs/docs/settings/dynamicapicontrollersettings/index.html +++ b/docs/docs/settings/dynamicapicontrollersettings/index.html @@ -8,7 +8,7 @@ 5. 动态API配置 | Furion - + @@ -22,7 +22,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

5. 动态API配置

5.1 关于配置#

动态 API 配置指的是 Furion 框架动态 API 配置选项。

5.2 配置信息#

  • DynamicApiControllerSettings:配置根节点

    • DefaultRoutePrefix:默认路由前缀,string,默认 api
    • DefaultHttpMethod:默认请求谓词,string,默认:POST
    • DefaultModule:默认模块名称(区域),可用作接口版本,string,默认:v1
    • LowercaseRoute:小写路由格式,bool,默认:true
    • KeepVerb:是否保留动作谓词,bool,默认:false
    • KeepName:是否保留默认名称,bool,默认:fasle
    • CamelCaseSeparator:骆驼(驼峰)命名分隔符,string,默认:-
    • VersionSeparator:版本分隔符,string,默认:@
    • ModelToQueryGET/HEAD 请求将 类类型参数转查询参数bool,默认 false
    • SupportedMvcController:是否支持 Mvc Controller 动态配置,bool,默认 false
    • AbandonControllerAffixes:默认去除控制器名称前后缀列表名,string[],默认:
      • AppServices
      • AppService
      • ApiController
      • Controller
      • Services
      • Service
    • AbandonActionAffixes:默认去除动作方法名称前后缀列表名,string[],默认:
      • Async
    • VerbToHttpMethods:复写默认方法名转 [HttpMethod] 规则,string[][] 二维数组类型,内置匹配规则为:
      ["post"] = "POST",
      ["add"] = "POST",
      ["create"] = "POST",
      ["insert"] = "POST",
      ["submit"] = "POST",
      ["get"] = "GET",
      ["find"] = "GET",
      ["fetch"] = "GET",
      ["query"] = "GET",
      ["getlist"] = "GET",
      ["getall"] = "GET",
      ["put"] = "PUT",
      ["update"] = "PUT",
      ["delete"] = "DELETE",
      ["remove"] = "DELETE",
      ["clear"] = "DELETE",
      ["patch"] = "PATCH"
      • 复写示例
      "DynamicApiControllerSettings": {
      "VerbToHttpMethods": [
      [ "getall", "HEAD" ], // => getall 会被复写为 `[HttpHead]`
      [ "other", "PUT" ] // => 新增一条新规则,比如,一 `[other]` 开头会转换为 `[HttpPut]` 请求
      ]
      }

5.3 配置示例#

{
"DynamicApiControllerSettings": {
"SupportedMvcController": true
}
}
Last updated on by 本心
- + diff --git a/docs/docs/settings/friendlyexceptionsettings/index.html b/docs/docs/settings/friendlyexceptionsettings/index.html index 3c22f238cf4..937fa294ba3 100644 --- a/docs/docs/settings/friendlyexceptionsettings/index.html +++ b/docs/docs/settings/friendlyexceptionsettings/index.html @@ -8,7 +8,7 @@ 6. 友好异常配置 | Furion - + @@ -22,7 +22,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

6. 友好异常配置

6.1 关于配置#

友好异常配置指的是 Furion 框架友好异常配置选项。

6.2 配置信息#

  • FriendlyExceptionSettings:配置根节点
    • HideErrorCode:隐藏错误码,bool 类型,默认 false
    • DefaultErrorCode:默认错误码,string 类型
    • DefaultErrorMessage:默认错误消息,string 类型

6.3 配置示例#

{
"FriendlyExceptionSettings": {
"DefaultErrorMessage": "系统异常,请联系管理员"
}
}

6.4 异常消息配置#

Furion 框架还为友好异常消息提供外部配置

6.4.1 配置信息#

  • ErrorCodeMessageSettings:配置根节点
    • Definitions:配置异常错误码消息类型,[错误状态码,错误消息][] 类型,如:[5000, "{0} 不能小于 {1}"]

6.4.2 配置示例#

{
"ErrorCodeMessageSettings": {
"Definitions": [
[5000, "{0} 不能小于 {1}"],
[5001, "我叫 {0} 名字", "百小僧"],
[5002, "Oops! 出错了"]
]
}
}
Last updated on by Monk
- + diff --git a/docs/docs/settings/localizationsettings/index.html b/docs/docs/settings/localizationsettings/index.html index fa5cf3d4cb6..450d26bab57 100644 --- a/docs/docs/settings/localizationsettings/index.html +++ b/docs/docs/settings/localizationsettings/index.html @@ -8,7 +8,7 @@ 8. 多语言配置 | Furion - + @@ -22,7 +22,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

8. 多语言配置

8.1 关于配置#

多语言配置指的是 Furion 框架全球化和本地化选项。

8.2 配置信息#

  • LocalizationSettings 多语言配置根节点
    • ResourcesPath:资源目录,string 类型,默认 Resources
    • SupportedCultures:支持的语言区域码类别,string[] 类型
    • DefaultCulture:默认语言区域码,如果为空,则取 SupportedCultures 第一项

8.3 配置示例#

{
"LocalizationSettings": {
"SupportedCultures": ["zh-CN", "en-US"], // 配置支持的语言列表
"DefaultCulture": "zh-CN" // 配置默认语言,如果不配置,取 SupportedCultures 的第一项
}
}
Last updated on by Monk
- + diff --git a/docs/docs/settings/specificationdocumentsettings/index.html b/docs/docs/settings/specificationdocumentsettings/index.html index 5fa1174df9b..9faba1e69ab 100644 --- a/docs/docs/settings/specificationdocumentsettings/index.html +++ b/docs/docs/settings/specificationdocumentsettings/index.html @@ -8,7 +8,7 @@ 7. 规范化文档配置 | Furion - + @@ -22,7 +22,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

7. 规范化文档配置

7.1 关于配置#

规范化文档配置指的是 Furion 框架 Swagger 文档配置选项。

7.2 配置信息#

  • SpecificationDocumentSettings:配置根节点
    • DocumentTitle:文档标题,string,默认 Specification Api Document
    • DefaultGroupName:默认分组名,string,默认 Default
    • EnableAuthorized:是否启用权限控制,bool,默认 true
    • FormatAsV2:采用 Swagger 2.0 版本,bool,默认 false
    • RoutePrefix:规范化文档地址,string,默认 api如果希望在首页,改为空字符串即可
    • DocExpansionState:文档显示方式,DocExpansion,默认 List,取值:
      • List:列表式(展开子类),默认值
      • Full:完全展开
      • None:列表式(不展开子类)
    • XmlComments:程序集注释描述文件名(可带 .xmlstring,默认 Furion.Application, Furion.Web.Entry, Furion.Web.Core
    • GroupOpenApiInfos:分组信息配置,SpecificationOpenApiInfo[],默认 { 'Group': 'Default'}
    • SecurityDefinitions:安全策略定义配置,SpecificationOpenApiSecurityScheme[],默认 []
    • Servers:配置 Server 下拉列表,OpenApiServer[] 类型,默认 [],如:{Servers:[ { Url:"地址", Description:"描述"} ]}
    • HideServers:是否隐藏 Server 下拉列表,bool 类型,默认 false

7.3 配置示例#

{
"SpecificationDocumentSettings": {
"GroupOpenApiInfos": [
{
"Group": "Group1",
"Title": "分组标题",
"Description": "这里是分组描述",
"Version": "版本号",
"TermsOfService": "https://furion.pro",
"Contact": {
"Name": "百小僧",
"Url": "https://gitee.com/monksoul",
"Email": "monksoul@outlook.com"
},
"License": {
"Name": "Apache-2.0",
"Url": "https://gitee.com/dotnetchina/Furion/blob/alpha/LICENSE"
}
}
]
}
}
Last updated on by Monk
- + diff --git a/docs/docs/settings/validationTypemessagesettings/index.html b/docs/docs/settings/validationTypemessagesettings/index.html index 6f77d64eb78..6de77c1d894 100644 --- a/docs/docs/settings/validationTypemessagesettings/index.html +++ b/docs/docs/settings/validationTypemessagesettings/index.html @@ -8,7 +8,7 @@ 3. 验证消息配置 | Furion - + @@ -22,7 +22,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

3. 验证消息配置

3.1 关于配置#

验证消息配置指的是 Furion 框架数据校验中验证类型默认消息配置选项。

3.2 配置信息#

  • ValidationTypeMessageSettings:配置根节点
    • Definitions:配置验证类型对应的消息类型,[类型名称,类型消息][] 类型,如:["Required", "值不能为空或Null"]

3.3 配置示例#

{
"ValidationTypeMessageSettings": {
"Definitions": [
["Required", "值不能为空或Null"],
["Numeric", "必须是数值类型"],
["StrongPassword", "密码太简单了!!!"]
]
}
}
Last updated on by Monk
- + diff --git a/docs/docs/signalr/index.html b/docs/docs/signalr/index.html index 9023df46e73..33aa0e32106 100644 --- a/docs/docs/signalr/index.html +++ b/docs/docs/signalr/index.html @@ -8,7 +8,7 @@ 24. 即时通讯 | Furion - + @@ -32,7 +32,7 @@
public static void HttpConnectionDispatcherOptionsSettings(HttpConnectionDispatcherOptions options)
{
// 配置
}
public static void HubEndpointConventionBuilderSettings(HubEndpointConventionBuilder Builder)
{
// 配置
}
}
}

以上配置等价于 SignalRStartup.cs 中的配置:

app.UseEndpoints(endpoints =>
{
var builder = endpoints.MapHub<ChatHub>("/hubs/chathub", options =>
{
// 配置
});
});

24.7 服务端和客户端双工通信#

24.7.1 触发所有客户端代码#

Clients.All.客户端方法(参数);

24.7.2 触发调用者客户端#

Clients.Caller.客户端方法(参数);

24.7.3 触发除了调用者以外的客户端#

Clients.Others.客户端方法(参数);

24.7.4 触发特定用户客户端#

Clients.User("用户").客户端方法(参数);

24.7.5 触发多个用户客户端#

Clients.Users("用户","用户2",...).客户端方法(参数);

24.7.6 触发分组内客户端#

Clients.Group("分组").客户端方法(参数);

24.7.7 触发多个分组客户端#

Clients.Groups("分组","分组2",...).客户端方法(参数);

24.7.8 触发分组外的客户端#

Clients.GroupExcept("分组").客户端方法(参数);

24.8 自定义用户唯一标识#

24.9 分组管理#

24.10 各个客户端连接 API#

24.10.1 Javascript 客户端#

24.10.2 Tavascript 客户端#

24.10.3 .NET 客户端#

24.10.4 Java 客户端#

24.11 常见例子#

24.11.1 实现消息广播、推送#

整理中...

24.11.2 实现聊天功能#

整理中...

24.11.3 实现 你画我来猜#

整理中...

24.12 反馈与建议#

与我们交流

给 Furion 提 Issue


了解更多

想了解更多 SignalR 知识可查阅 SignalR 官方文档ASP.NET Core SignalR 章节。

Last updated on by Monk
- + diff --git a/docs/docs/source/index.html b/docs/docs/source/index.html index ad3683d8a66..a8a6ec60531 100644 --- a/docs/docs/source/index.html +++ b/docs/docs/source/index.html @@ -8,7 +8,7 @@ 1.3 示例结构 | Furion - + @@ -54,7 +54,7 @@
#prefer fields not to be prefaced with this. or Me. in Visual Basic
dotnet_style_qualification_for_field = false:suggestion
#prefer methods not to be prefaced with this. or Me. in Visual Basic
dotnet_style_qualification_for_method = false:suggestion
#prefer properties not to be prefaced with this. or Me. in Visual Basic
dotnet_style_qualification_for_property = false:suggestion
# Add file header
file_header_template = -----------------------------------------------------------------------------\nFur 是 .NET 5 平台下企业应用开发最佳实践框架。\nCopyright © 2020 Furion, Baiqian Co.,Ltd.\n\n框架名称:Furion\n框架作者:百小僧\n框架版本:1.0.0\n源码地址:Gitee:https://gitee.com/dotnetchina/Furion \n Github:https://github.com/monksoul/Furion \n开源协议:Apache-2.0(http://www.apache.org/licenses/LICENSE-2.0)\n-----------------------------------------------------------------------------

1.3.4 Furion 核心层#

Furion 核心层是 Furion 框架的中心,也是 Furion 能够支撑起来的必备层。

源码结构:

Furion
├─Furion.csproj
├─Furion.csproj.user
├─FurStartup.cs
├─ViewEngine
| ├─IViewEngine.cs
| ├─ViewEngine.cs
| ├─Templates
| | ├─IViewEngineCompiledTemplate.cs
| | ├─IViewEngineTemplate.cs
| | ├─ViewEngineCompiledTemplate.cs
| | └ViewEngineTemplate.cs
| ├─Options
| | └ViewEngineCompilationOptions.cs
| ├─Models
| | └AnonymousTypeWrapper.cs
| ├─Exceptions
| | ├─ViewEngineCompilationException.cs
| | └ViewEngineException.cs
| ├─Compilations
| | ├─IViewEngineCompilationOptionsBuilder.cs
| | └ViewEngineCompilationOptionsBuilder.cs
├─UnifyResult
| ├─Providers
| | ├─IUnifyResultProvider.cs
| | └RESTfulResultProvider.cs
| ├─Models
| | └RESTfulResult.cs
| ├─Filters
| | └SuccessUnifyResultFilter.cs
| ├─Extensions
| | └UnifyResultServiceCollectionExtensions.cs
├─SpecificationDocument
| ├─Options
| | └SpecificationDocumentSettingsOptions.cs
| ├─Models
| | ├─GroupOrder.cs
| | ├─SpecificationOpenApiInfo.cs
| | ├─SpecificationOpenApiSecurityRequirementItem.cs
| | └SpecificationOpenApiSecurityScheme.cs
| ├─Extensions
| | ├─SpecificationDocumentApplicationBuilderExtensions.cs
| | └SpecificationDocumentServiceCollectionExtensions.cs
| ├─Builders
| | └SpecificationDocumentBuilder.cs
| ├─Assets
| | └index-mini-profiler.html
├─ObjectMapper
| ├─Extensions
| | └ObjectMapperServiceCollectionExtensions.cs
| ├─Dependencies
| | └IObjectMapper.cs
├─LinqBuilder
| ├─Visitors
| | └ParameterReplaceExpressionVisitor.cs
| ├─Extensions
| | └LinqExtensions.cs
| ├─Builders
| | └LinqExpression.cs
├─FriendlyException
| ├─Oops.cs
| ├─Providers
| | └IErrorCodeTypeProvider.cs
| ├─Options
| | └ErrorCodeMessageSettingsOptions.cs
| ├─Models
| | └MethodIfException.cs
| ├─Filters
| | └FriendlyExceptionFilter.cs
| ├─Extensions
| | └FriendlyExceptionServiceCollectionExtensions.cs
| ├─Attributes
| | ├─ErrorCodeItemMetadataAttribute.cs
| | ├─ErrorCodeTypeAttribute.cs
| | └IfExceptionAttribute.cs
├─DynamicApiController
| ├─Penetrates.cs
| ├─Providers
| | └DynamicApiControllerFeatureProvider.cs
| ├─Options
| | └DynamicApiControllerSettingsOptions.cs
| ├─Models
| | └ParameterRouteTemplate.cs
| ├─Extensions
| | └DynamicApiControllerServiceCollectionExtensions.cs
| ├─Enums
| | └ApiSeats.cs
| ├─Dependencies
| | └IDynamicApiController.cs
| ├─Conventions
| | └DynamicApiControllerApplicationModelConvention.cs
| ├─Attributes
| | ├─ApiDescriptionSettingsAttribute.cs
| | ├─ApiSeatAttribute.cs
| | └DynamicApiControllerAttribute.cs
├─DependencyInjection
| ├─Options
| | └DependencyInjectionSettingsOptions.cs
| ├─Models
| | └ExternalService.cs
| ├─Extensions
| | └DependencyInjectionServiceCollectionExtensions.cs
| ├─Enums
| | ├─InjectionActions.cs
| | ├─InjectionPatterns.cs
| | └RegisterType.cs
| ├─Dependencies
| | ├─IPrivateDependency.cs
| | ├─IScoped.cs
| | ├─ISingleton.cs
| | ├─ITransient.cs
| | ├─Proxies
| | | └IDispatchProxy.cs
| ├─Attributes
| | ├─InjectionAttribute.cs
| | └SkipScanAttribute.cs
├─DataValidation
| ├─Validators
| | └DataValidator.cs
| ├─Providers
| | └IValidationMessageTypeProvider.cs
| ├─Options
| | └ValidationTypeMessageSettingsOptions.cs
| ├─Models
| | └DataValidationResult.cs
| ├─Filters
| | └DataValidationFilter.cs
| ├─Extensions
| | ├─DataValidationExtensions.cs
| | └DataValidationServiceCollectionExtensions.cs
| ├─Enums
| | ├─ValidationPattern.cs
| | └ValidationTypes.cs
| ├─Attributes
| | ├─DataValidationAttribute.cs
| | ├─NonValidationAttribute.cs
| | ├─ValidationItemMetadataAttribute.cs
| | ├─ValidationMessageAttribute.cs
| | ├─ValidationMessageTypeAttribute.cs
| | └ValidationTypeAttribute.cs
├─DataEncryption
| ├─AESEncryption.cs
| ├─DESCEncryption.cs
| └MD5Encryption.cs
├─DatabaseAccessor
| ├─UnitOfWork
| | ├─Filters
| | | └UnitOfWorkFilter.cs
| | ├─Attributes
| | | ├─NonTransactAttribute.cs
| | | └UnitOfWorkAttribute.cs
| ├─Repositories
| | ├─EFCoreRepository.cs
| | ├─IMSRepository.cs
| | ├─IRepository.cs
| | ├─ISqlRepository.cs
| | ├─MSRepository.cs
| | ├─SqlRepository.cs
| | ├─Implantations
| | | ├─DeletableRepository.cs
| | | ├─InsertableRepository.cs
| | | ├─OperableRepository.cs
| | | ├─ReadableRepository.cs
| | | ├─SqlExecutableRepository.cs
| | | ├─SqlReaderRepository.cs
| | | ├─UpdateableRepository.cs
| | | └WritableRepository.cs
| | ├─Dependencies
| | | ├─IDeletableRepository.cs
| | | ├─IInsertableRepository.cs
| | | ├─IOperableRepository.cs
| | | ├─IReadableRepository.cs
| | | ├─IRepositoryDependency.cs
| | | ├─ISqlExecutableRepository.cs
| | | ├─ISqlReaderRepository.cs
| | | ├─IUpdateableRepository.cs
| | | └IWritableRepository.cs
| ├─Pools
| | ├─DbContextPool.cs
| | └IDbContextPool.cs
| ├─MultiTenants
| | ├─Locators
| | | └MultiTenantDbContextLocator.cs
| | ├─Enums
| | | └MultiTenantOptions.cs
| | ├─Entities
| | | └Tenant.cs
| | ├─Dependencies
| | | ├─IMultiTenantOnDatabase.cs
| | | ├─IMultiTenantOnSchema.cs
| | | ├─IMultiTenantOnTable.cs
| | | └IPrivateMultiTenant.cs
| ├─Models
| | ├─DbProvider.cs
| | ├─PagedList.cs
| | ├─ProcedureOutputResult.cs
| | ├─ProcedureOutputValue.cs
| | ├─SqlTemplate.cs
| | └SqlTemplateParameter.cs
| ├─Locators
| | ├─IDbContextLocator.cs
| | └MasterDbContextLocator.cs
| ├─Interceptors
| | ├─DbContextSaveChangesInterceptor.cs
| | ├─SqlCommandProfilerInterceptor.cs
| | └SqlConnectionProfilerInterceptor.cs
| ├─Helpers
| | └DbHelpers.cs
| ├─Extensions
| | ├─DatabaseAccessorServiceCollectionExtensions.cs
| | ├─PagedQueryableExtensions.cs
| | ├─Repositories
| | | ├─IEntityExtensions.cs
| | | ├─IEntityWithDbContextLocatorExtensions.cs
| | | └SqlExtensions.cs
| | ├─DatabaseProvider
| | | ├─DatabaseProviderServiceCollectionExtensions.cs
| | | └Penetrates.cs
| | ├─DatabaseFacade
| | | ├─DbDataConvertExtensions.cs
| | | ├─DbObjectExtensions.cs
| | | └SqlAdoNetExtensions.cs
| ├─Enums
| | ├─DbFunctionType.cs
| | ├─EFCoreErrorCodes.cs
| | └ManualOptions.cs
| ├─Entities
| | ├─Dependencies
| | | ├─Entity.cs
| | | ├─EntityBase.cs
| | | ├─EntityNotKey.cs
| | | ├─IEntity.cs
| | | └IEntityNotKey.cs
| | ├─Configures
| | | ├─IEntitySeedData.cs
| | | ├─IEntityTypeBuilder.cs
| | | ├─IModelBuilderFilter.cs
| | | └IPrivateModelBuilder.cs
| | ├─Attributes
| | | ├─FakeDeleteAttribute.cs
| | | ├─NonAutomaticAttribute.cs
| | | └QueryableFunctionAttribute.cs
| ├─DynamicModels
| | ├─DynamicModelCacheKeyFactory.cs
| | └IEntityMutableTable.cs
| ├─Contexts
| | ├─AppDbContext.cs
| | ├─Builders
| | | ├─AppDbContextBuilder.cs
| | | ├─Models
| | | | └DbContextCorrelationType.cs
| | ├─Attributes
| | | └AppDbContextAttribute.cs
| ├─Attributes
| | └DbParameterAttribute.cs
| ├─Advances
| | ├─Proxies
| | | └SqlDispatchProxy.cs
| | ├─Models
| | | └SqlProxyMethod.cs
| | ├─Dependencies
| | | └ISqlDispatchProxy.cs
| | ├─Attributes
| | | ├─SqlExecuteAttribute.cs
| | | ├─SqlFunctionAttribute.cs
| | | ├─SqlProcedureAttribute.cs
| | | ├─Basics
| | | | ├─SqlObjectProxyAttribute.cs
| | | | ├─SqlProxyAttribute.cs
| | | | └SqlSentenceProxyAttribute.cs
├─CorsAccessor
| ├─Options
| | └CorsAccessorSettingsOptions.cs
| ├─Extensions
| | ├─CorsAccessorApplicationBuilderExtensions.cs
| | └CorsAccessorServiceCollectionExtensions.cs
├─ConfigurableOptions
| ├─Options
| | └IConfigurableOptions.cs
| ├─Extensions
| | └ConfigurableOptionsServiceCollectionExtensions.cs
| ├─Attributes
| | └OptionsSettingsAttribute.cs
├─Authorization
| ├─Penetrates.cs
| ├─Requirements
| | └AuthorizePolicyRequirement.cs
| ├─Providers
| | └AuthorizePolicyProvider.cs
| ├─Options
| | └JWTSettingsOptions.cs
| ├─Handlers
| | └AuthorizePolicyHandler.cs
| ├─Extensions
| | └PolicyAuthorizationServiceCollectionExtensions.cs
| ├─Attributes
| | └AuthorizePolicyAttribute.cs
├─App
| ├─App.cs
| ├─Startups
| | ├─AppStartup.cs
| | └HostingStartup.cs
| ├─Options
| | └AppSettingsOptions.cs
| ├─Filters
| | └StartupFilter.cs
| ├─Extensions
| | ├─AppApplicationBuilderExtensions.cs
| | ├─AppServiceCollectionExtensions.cs
| | ├─WebHostBuilderExtensions.cs
| | ├─Types
| | | └ObjectExtensions.cs
| ├─Attributes
| | └AppStartupAttribute.cs

1.3.5 Furion.Application 业务应用层#

Furion.Application 业务应用层是最常用的层,几乎所有的业务代码都在这个层中编写。

源码结构:

Furion.Application
├─Furion.Application.Core.csproj
├─Furion.Application.Core.xml
└FurApplicationStartup.cs

1.3.6 Furion.Core 仓储实体层#

Furion.Core 主要是存储自定义仓储和定义实体的层。

源码结构:

Furion.Core
├─Furion.Core.csproj
└FurCoreStartup.cs

1.3.7 Furion.Database.Migrations 数据库架构维护层#

Furion.Database.Migrations 主要是用来存放 Database FirstCode First 生成的维护文件。

源码结构:

Furion.Database.Migrations
└Furion.Database.Migrations.csproj

1.3.8 Furion.EntityFramework.Core 数据库上下文配置层#

Furion.EntityFramework.Core 主要是用来配置数据库上下文和其他数据库相关配置信息的。

源码结构:

Furion.EntityFramework.Core
└Furion.EntityFramework.Core.csproj

1.3.9 Furion.Web.Core 应用核心层#

Furion.Web.Core 主要是用来配置 Web 入口一些代码,如 FilterMiddlewares 等。

源码结构:

Furion.Web.Core
├─Furion.Web.Core.xml
└FurWebCoreStartup.cs

1.3.10 Furion.Web.Entry 应用入口层#

Furion.Web.Entry 是我们的应用层,也就是我们的 Web 项目层,发布层。

源码结构:

Furion.Web.Entry
├─appsettings.Development.json
├─appsettings.json
├─Furion.Web.Entry.csproj
├─Furion.Web.Entry.csproj.user
├─Furion.Web.Entry.xml
├─Program.cs
├─Startup.cs
├─wwwroot
| └README.md
├─Properties
| └launchSettings.json
├─Controllers
Last updated on by Monk
- + diff --git a/docs/docs/specification-document/index.html b/docs/docs/specification-document/index.html index d2cc264e250..81a5b048ef6 100644 --- a/docs/docs/specification-document/index.html +++ b/docs/docs/specification-document/index.html @@ -8,7 +8,7 @@ 6. 规范化接口文档 | Furion - + @@ -56,7 +56,7 @@
/// <summary>
/// 处理输出状态码
/// </summary>
/// <param name="context"></param>
/// <param name="statusCode"></param>
/// <returns></returns>
public async Task OnResponseStatusCodes(HttpContext context, int statusCode)
{
switch (statusCode)
{
// 处理 401 状态码
case StatusCodes.Status401Unauthorized:
await context.Response.WriteAsJsonAsync(new RESTfulResult<object>
{
StatusCode = StatusCodes.Status401Unauthorized,
Succeeded = false,
Data = null,
Errors = "401 Unauthorized",
Extras = UnifyContext.Take(),
Timestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()
});
break;
// 处理 403 状态码
case StatusCodes.Status403Forbidden:
await context.Response.WriteAsJsonAsync(new RESTfulResult<object>
{
StatusCode = StatusCodes.Status403Forbidden,
Succeeded = false,
Data = null,
Errors = "403 Forbidden",
Extras = UnifyContext.Take(),
Timestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()
});
break;
default:
break;
}
}
}
}

之后在 Startup.cs 中注册即可:

services.AddControllers()
.AddInjectWithUnifyResult<RESTfulResultProvider>();
特别注意

默认情况下,规范化结果不会对 401403 状态码进行规范化处理,如需启动该状态码处理,只需在 Startup.cs 中的 Configure 中启用接口:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
// 添加规范化结果状态码,需要在这里注册
app.UseUnifyResultStatusCodes();
// 其他注册...
}

6.7.1 排除规范化处理#

有些时候,我们某些接口不需要进行规范化处理,这时,我们只需要帖 [NonUnify] 特性即可。

6.7.2 规范化结果添加额外数据#

默认的规范化结果中包含 extras 属性,可以配置额外数据返回到客户端:

UnifyContext.Fill(new { Message = "操作成功" });

6.7.3 自定义特别接口规范化结果#

有些时候,我们特定接口需返回特定的接口类型,无需规范化处理,这时候我们只需要贴 [UnifyResult(typeof(结果类))][ProducesResponseType(typeof(结果类),200)],如:

[UnifyResult(typeof(Person))]
public Person GetPerson(int id)
{
// ...
}

6.8 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by Monk
- + diff --git a/docs/docs/split-db/index.html b/docs/docs/split-db/index.html index 511e57f8555..8aa273fecca 100644 --- a/docs/docs/split-db/index.html +++ b/docs/docs/split-db/index.html @@ -8,7 +8,7 @@ 9.28 分表分库 | Furion - + @@ -25,7 +25,7 @@ 例如按时间字段分片,有些分片存储最近时间段内的数据,可能会被频繁的读写,而有些分片存储的历史数据,则很少被查询

9.28.4.3 一致性 Hash 算法#

一致性 Hash 算法能很好的解决因为 Hash 取模而产生的分片集群扩容时,需要迁移旧的数据的难题。具体原理可参考 https://www.cnblogs.com/duhuo/p/4996105.html

9.28.5 分库分表带来的问题#

任何事情都有两面性,分库分表也不例外,如果采用分库分表,会引入新的的问题:

9.28.5.1 分布式事务问题#

使用分布式事务中间件解决,具体是通过最终一致性还是强一致性分布式事务,看业务需求,这里就不多说。

9.28.5.2 跨节点关联查询 Join 问题#

切分之前,我们可以通过 Join 来完成。而切分之后,数据可能分布在不同的节点上,此时 Join 带来的问题就比较麻烦了,考虑到性能,尽量避免使用 Join 查询。

解决这个问题的一些方法:

  • 全局表

全局表,也可看做是 "数据字典表",就是系统中所有模块都可能依赖的一些表,为了避免跨库 Join 查询,可以将 这类表在每个数据库中都保存一份。这些数据通常很少会进行修改,所以也不担心一致性的问题。

  • 字段冗余

利用空间换时间,为了性能而避免 join 查询。例:订单表保存 userId 时候,也将 userName 冗余保存一份,这样查询订单详情时就不需要再去查询"买家 user 表"了。

  • 数据组装

在系统层面,分两次查询。第一次查询的结果集中找出关联数据 id,然后根据 id 发起第二次请求得到关联数据。最后将获得到的数据进行字段拼装。

9.28.5.3 跨节点分页、排序、函数问题#

跨节点多库进行查询时,会出现 Limit 分页、Order by 排序等问题。分页需要按照指定字段进行排序,当排序字段就是分片字段时,通过分片规则就比较容易定位到指定的分片;

当排序字段非分片字段时,就变得比较复杂了。需要先在不同的分片节点中将数据进行排序并返回,然后将不同分片返回的结果集进行汇总和再次排序,最终返回给用户。

9.28.5.4 全局主键避重问题#

如果都用主键自增肯定不合理,如果用 UUID 那么无法做到根据主键排序,所以我们可以考虑通过雪花 ID 来作为数据库的主键,

9.28.5.5 数据迁移问题#

采用双写的方式,修改代码,所有涉及到分库分表的表的增、删、改的代码,都要对新库进行增删改。同时,再有一个数据抽取服务,不断地从老库抽数据,往新库写,

边写边按时间比较数据是不是最新的。

9.28.6 如何实现#

特别说明

由于分表分库不仅仅需要内置代码的支持,同时还需要集成数据库中间件,这里推荐 MyCat 中间件。MyCat 官方网站

Furion 框架中提供了轻量级的 分表分库 支持:

  • 动态切换数据库
// 直接改变数据库
repository.ChangeDatabase("数据库连接字符串");
// 通过数据库上下文定位器切换
repository.Change<Entity, MyDbContextLocator2>();

如需跨库查询,需用到数据库技术,如 SqlServer 链接服务器或同义词。

  • 动态切换数据库表

第一步、配置数据库上下文特性[AppDbContext( Mode=DbContextMode.Dynamic)]

第二步、需要动态修改表名的实体继承 IEntityMutableTable<TEntity> 接口,并实现 GetTableName() 返回表名方法

最后通过 BuildChange<TEntity> 切换即可。

var rep = repository.BuildChange<Persion>();

调用 BuildChange 方法之后会自动调用 GetTableName() 方法。

了解更多

想了解更多 DynamicModelCacheKeyFactory 知识可查阅 EF Core - 多个模型之间交替 章节。

9.28.7 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by 我乖的阔爱
- + diff --git a/docs/docs/sqlsugar/index.html b/docs/docs/sqlsugar/index.html index e63188135eb..3ad8739bbcd 100644 --- a/docs/docs/sqlsugar/index.html +++ b/docs/docs/sqlsugar/index.html @@ -8,7 +8,7 @@ 10.1. SqlSugar 集成 | Furion - + @@ -42,7 +42,7 @@
//存储过程用法
var nameP= new SugarParameter("@name", "张三");
var ageP= new SugarParameter("@age", null, true);//设置为output
var dt = db.Ado.UseStoredProcedure().GetDataTable("sp_school",nameP,ageP);
方法名描述返回值
SqlQuery< T >查询所有返回实体集合List
SqlQuery<T,T2>可以返回 2 个结果集Tuple<List, List>
SqlQuerySingle查询第一条记录T
GetDataTable查询所有DataTable
GetDataReader读取 DR 需要手动释放 DRDataReader
GetDataSetAll获取多个结果集DataSet
ExecuteCommand返回受影响行数,一般用于增删改int
GetScalar获取首行首列object
GetString获取首行首列string
GetInt获取首行首列int
GetLong获取首行首列long
GetDouble获取首行首列Double
GetDecimal获取首行首列Decimal
GetDateTime获取首行首列DateTime

想了解更多 SqlSugar 知识可查阅 SqlSugar 官网

10.1.7 打印 sqlSwagger#

services.AddSqlSugar(new ConnectionConfig
{
ConnectionString = "Server=.xxxxx",//连接符字串
DbType = DbType.SqlServer,
IsAutoCloseConnection = true,
InitKeyType = InitKeyType.Attribute//从特性读取主键自增信息
},
db =>
{
db.Aop.OnLogExecuting = (sql, pars) =>
{
App.PrintToMiniProfiler("SqlSugar", "Info", sql + "\r\n" +string.Join(",", pars?.Select(it => it.ParameterName + ":" + it.Value)));
};
});

10.1.8 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by Monk
- + diff --git a/docs/docs/template/index.html b/docs/docs/template/index.html index 10f81ba7c77..24fc1f4682b 100644 --- a/docs/docs/template/index.html +++ b/docs/docs/template/index.html @@ -8,7 +8,7 @@ 2.2 官方脚手架 | Furion - + @@ -22,7 +22,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

2.2 官方脚手架

特别说明

脚手架不是安装在项目中的! 而是通过 CMDPowerShell 安装到操作系统中的。

2.2.1 脚手架#

Furion 官方提供了多种 Web 应用类型的脚手架,方便大家快速创建多层架构项目。目前支持以下应用脚手架:

模板类型名称版本关键词描述
nugetFurion.Template.Mvcnuget👉 furionmvcMvc 模板
nugetFurion.Template.Apinuget👉 furionapiWebApi 模板
nugetFurion.Template.Appnuget👉 furionappMvc/WebApi 模板
nugetFurion.Template.Razornuget👉 furionrazorRazorPages 模板
nugetFurion.Template.RazorWithWebApinuget👉 furionrazorapiRazorPages/WebApi 模板
nugetFurion.Template.Blazornuget👉 furionblazorBlazor 模板
nugetFurion.Template.BlazorWithWebApinuget👉 furionblazorapiBlazor/WebApi 模板

2.2.2 安装脚手架#

打开 CMDPowershell 执行模板安装命令:

dotnet new --install Furion.Template.Mvc::1.15.0

2.2.3 使用脚手架#

dotnet new furionmvc -n 项目名称

这样就可以生成项目代码了,生成之后推荐将所有的 nuget 包更新到最新版本。

特别提醒

furionmvc 对应的是上面列表的 关键字,我们也可以通过 dotnet new --list 查看。

想了解更多可以使用 dotnet new 关键字 --help 查看更多参数。

2.2.4 脚手架更新#

只需要重新安装最新版替换即可,如:

dotnet new --install Furion.Template.Mvc::1.x.x

不带版本号总是安装最新的版本。

2.2.5 反馈与建议#

与我们交流

给 Furion 提 Issue


了解更多

想了解更多 模板知识 知识可查阅 dotnet-new 模板 章节。

Last updated on by Monk
- + diff --git a/docs/docs/tran/index.html b/docs/docs/tran/index.html index c2b1cc23d00..1165fdc1ec0 100644 --- a/docs/docs/tran/index.html +++ b/docs/docs/tran/index.html @@ -8,7 +8,7 @@ 9.26 事务和工作单元 | Furion - + @@ -34,7 +34,7 @@
// 框架封装的仓储
_testRepository.Insert(new Blog { Url = "http://blogs.msdn.com/dotnet" });
_testRepository.SaveChanges();
// 提交事务
scope.Complete();
}
catch (System.Exception)
{
// 自动回滚
}
}
}

9.26.4 工作单元特性说明#

9.26.4.1 [UnitOfWork]#

[UnitOfWork] 特性用来标记事务信息,如作用范围,隔离级别等。

  • Enabled:是否启动工作单元,默认 true
  • ScopeOption:定义事务范围行为,默认 TransactionScopeOption.Required
  • IsolationLevel:设置事务隔离级别,默认 IsolationLevel.ReadCommitted;
  • AsyncFlowOption:允许跨线程连续任务的事务流,如有异步操作需开启该选项,默认开启
特别注意

一旦方法贴了 [UnitOfWork(false)] 特性后,那么该方法不再启用工作单元模式,也就是不包含事务,也不会自动提交数据库。慎用!

9.26.5 反馈与建议#

与我们交流

给 Furion 提 Issue


了解更多

想了解更多 事务 知识可查阅 EF Core - 使用事务 章节。

Last updated on by Monk
- + diff --git a/docs/docs/unittest/index.html b/docs/docs/unittest/index.html index cafa1e2a9f7..2f69364e84e 100644 --- a/docs/docs/unittest/index.html +++ b/docs/docs/unittest/index.html @@ -8,7 +8,7 @@ 29.1 单元测试 | Furion - + @@ -22,7 +22,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️
Last updated on by Monk
- + diff --git a/docs/docs/upgrade/index.html b/docs/docs/upgrade/index.html index a6fc58ff869..40e9697f732 100644 --- a/docs/docs/upgrade/index.html +++ b/docs/docs/upgrade/index.html @@ -8,7 +8,7 @@ 1.6 更新日志 | Furion - + @@ -16,13 +16,13 @@ - +
-
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

1.6 更新日志

此章节只记录重大版本更新日志,小迭代版本不做更新。想了解更多更新内容,可查阅 CHANGELOG.md

v1.16.0 (当前版本)#

  • 新特性

    • [新增] IDGenerator 雪花 ID 算法,感谢 idgenerator 作者提交 PR #PR204 #I3B60S
    • [新增] DbContext 刷新多租户缓存拓展方法 #I39N5U
    • [新增] 自定义配置单个控制器名称规范,如小写路由 #I3A5XL
    • [新增] 获取当前选择区域语言方法 #I3BSDH
  • 突破性变化

    • [升级] .NET 5 SDK 至 5.0.4 版本 #I3ASTL
    • [重构] 远程请求所有功能 #I2LB7M
    • [重构] JSON 序列化功能,提供统一的抽象接口,方便自由替换 JSON#I39GT9
    • [重构] 验证失败返回消息模型及规范化接口验证参数 #I3AFQW
    • [优化] 插件式开发热插拔功能,实现动态加载卸载 #PR200, 感谢 @SamWangCoder
    • [移除] 移除 JsonSerializerUtility 静态类及移除属性大写序列化拓展配置 #I3AFRJ
  • 问题修复

    • [修复] MVC 模式下不支持验证自定义验证逻辑 #I39LM5
    • [修复] 验证数值类型正则表达式不支持负数 bug #I39YUV
    • [修复] 框架启动时无法加载未被引用的程序集 bug #I3A3Z4
    • [修复] EFCoreRepository.IsAttached() 方法判断错误 bug #I3A824
    • [修复] 动态API 驼峰显示配置无效 bug #I3AF32
    • [修复] cli.ps1 不支持新版本 EFCore bug #I3APO9
    • [修复] EFCore 实体配置 [Table] 特性无效 bug #I3BAYH
    • [修复] 动态 WebAPI CheckIsSplitCamelCase bug #I3BLKX
    • [修复] 修复动态 WebAPI 配置保留 Action 的 Async 后缀无效问题 #I3C3DA
    • [修复] JWT Token 刷新后旧的刷新 Token 依旧可用 bug #I3C8ZH
    • [修复] 多语言 Razor 视图变量多语言乱码问题 #I3CBMU
  • 其他更改

    • [优化] 默认序列化提供器 System.Text.Json 反序列化字符串时区分大小写问题 #I3BSXV
    • [优化] 优化 MessageCenter 性能问题 #I39PRR
    • [优化] 数据库上下文池小性能优化
  • 文档变化

    • [新增] Docker 环境下自动化部署 #PR209
    • [新增] JSON 序列化 文档 #I3B6D8
    • [更新] 跨域、安全授权、即时通信文档、多语言、规范化文档
  • 问答答疑

    • [答疑] Furion.Extras.DatabaseAccessor.SqlSugar 配置多个数据库打印 SQL 语句问题 #I39PDC
    • [答疑] ORACLE 数据库多租户模式下返回值为指定类型时系统卡死 #I39RNH
    • [答疑] 假删除指向异常 #I39XZA
    • [答疑] Furion 多语言配置节是放在 AppSettings 里面还是外面呢? #I3A4SB
    • [答疑] 没找到数据库上下文 #I3A5HS
    • [答疑] 有 QQ 交流群吗? #I3AAM7
    • [答疑] Vue3 环境下配置 SignalR 跨域出错 #I3ALQ7
    • [答疑] 设置 Swagger 参数非必填 #I3AT02
    • [答疑] EFCore 调用 Insert 时报 Unknown column 'Discriminator' in 'field list' 异常 #I3B2LC
    • [答疑] 逆向 mysql 数据库时 cli 出现错误 #I3B64F
    • [答疑] Sql 高级代理使用过程中 DateTime 类型的参数序列化失败 #I3AZXK
    • [答疑] 使用 Mysql 执行 Add-Migration 报错 #I3B8EW
    • [答疑] Saas 多租户模式-独立 Database 模式下无法获取 Tenant, 导致无法自动切换的问题#I3AVXU
    • [答疑] 如何自定义 WebAPI 统一结果模型 #I3BBYW #I3BBYV
    • [答疑] 在 Web.Entry 项目新建了一个 Controller,多了未知方法 #I3BKH5
    • [答疑] AOP 拦截如何解析服务 #I3BUM3
    • [答疑] 动态 WebAPI 返回参数被省略 #I3C2XR
    • [答疑] 如何设置某一个接口响应数据不自动转小写,按原始字段名返回 #I38L9B
    • [答疑] code first 如何配置自动迁移 #I3CCR0
    • [答疑] webapi 混合授权如何区分不同系统 #I3CJCY
    • [答疑] EFCore 不支持递归无限级遍历关系 #I3CET9
  • 不做实现

    • [废弃] 建议 EFCore 可配置外键关系导航问题 #I3994X
    • [废弃] 建议将 EFCore 剥离出来,作为插件的形式提供。这样可以选择自己喜欢的 ORM #I3ABNX
    • [废弃] 事件总线能否提供返回值 #I3AWL6
    • [废弃] Sql 模板能仿照 Mybatis 一样加各种标签吗?#I3ASRS
    • [废弃] EFCore 更新或排除更新指定列支持传入 DTO 模型 #I3AS5K
    • [废弃] 新增 UnitOfWork 事务完成事件 #I3BRMI

v1.15.0 (已发布)#

  • 新特性

    • [新增] 跳过特定实体数据库操作监听特性 #I386LB
    • [新增] IEntityChangedListener 增加对 OldEntity 的支持 #I385X2
    • [新增] 实时通信自动配置集线器拓展及特性 #I387QX
    • [新增] Mapster 拓展支持 IMapper 依赖注入方式 #I38C7C
    • [新增] [AppDbContext] 特性默认构造函数 #I38J97
    • [新增] UnifyContext.GetExceptionMetadata(context) 返回错误码支持 #I38ONX
  • 突破性变化

  • 问题修复

    • [修复] 多次循环中调用 Db.GetNewDbContext() 还是获取到同一个对象 #I38NNP
    • [修复] Swagger 过滤掉 object 类型属性问题 #I38FHL
    • [修复] 同一类不支持多继承 IEntityChangedListener 问题 #I38UQJ
    • [修复] 自定义序列化属性名称导致验证失败属性不匹配问题 #I38W8Z
  • 其他更改

    • [优化] 代码不规范命名导致开发者阅读代码时产生歧义
  • 文档变化

    • [新增] FluentValidation 集成文档 #I38IOT
  • 问答答疑

    • [答疑] Furion 框架版本向下兼容问题 #I38WMZ
  • 不做实现

    • [废弃] 建议 SqlSugar 添加动态切换数据库功能 #I38G4M
    • [废弃] 建议 MessageCenter 采用 Channel 实现 #I38BP8
    • [废弃] 建议接口文档整合 Knife4jUI 或 Redoc #I38S70

v1.14.0(已发布)#

  • 新特性

    • [新增] EFCore 5.0 的 Oracle 数据库支持 #I37Z8E
    • [新增] 控制是否在开发环境下显示数据库连接信息 #I37YQ2
    • [新增] [NonUnify] 支持在类中贴此特性 #I359Q6
    • [新增] 网络请求 字符串 HttpClient 拦截器 #I35F3E
    • [新增] HttpContextHttpRequest 获取远程地址拓展 #I3688Z
    • [新增] services.AddMvcFilter<> 添加 Mvc 过滤器拓展 #I368BH
  • 突破性变化

    • [升级] 框架依赖的 .NET 5 SDK 至最新版 5.0.3 #I37YQQ
    • [升级] Swashbuckle.AspNetCore 组件包到 6.0.x 版本 #I37EZK
    • [移除] Furion 框架 JWT 拓展类,只在 Furion.Extras.Authentication.JwtBearer 中保留 #I35D59
  • 问题修复

    • [修复] 传入错误 JWT Token 字符串导致自动刷新 Token 出现字符串边界值异常 bug #I34ZE5
    • [修复] 瞬时作用域数据库上下文也会自动加入工作单元导致写日志时连锁异常 bug #I37WTV
  • 其他更改

    • [优化] 获取系统环境参数的性能 #I36SR5
    • [优化] Furion 底层添加 Mvc 过滤器代码 #I36SKA
    • [优化] 添加默认 Json 序列化时间默认时间格式 #I36SL0
    • [升级] 升级 SqlSugar 拓展包到 5.0.2.6 版本 #I36SIG
  • 文档变化

    • [新增] 数据库入门文档 #I37Z8S
    • [新增] 更新日志文档 #I36PI0
    • [新增] 请求审计日志、执行 Sql 更新日志文档 #I36PIK
    • [新增] 前端使用 axios 跨域配置文档 #I36PIT
    • [新增] App 静态类获取应用、环境更多信息数据 #I36SOV
    • [新增] 英文版 README.md 介绍 #I37QHP
  • 问答答疑

  • 不做实现

    • [废弃] 多语言资源文件自动创建 #I35AA4
    • [废弃] 建议多语言加上维吾尔语支持 #I37X1L

v1.13.0(已发布)#

  • 新特性

    • [新增] 多语言功能及拓展 #I2DOCL
    • [新增] 事件总线功能及消息中心 #I23BKN
    • [新增] Swagger 分组显示隐藏配置 #I2AHH8
    • [新增] Furion.Extras.Logging.Serilog 拓展插件 #I2AAN8
    • [新增] cli.ps 支持 -Namespace 命名空间指定 #I2A175
    • [新增] Swagger 规范化化文档授权失效后自动取消授权锁 #I2AIWC
    • [新增] Request.Body 支持重复读功能,主要解决微信 SDK 问题 #I2AMG0
    • [新增] 网络请求功能及文档 #I2APGJ
    • [新增] SqlSugar 拓展包支持打印 sqlMiniProfiler#I2ASLS
    • [新增] Furion.Extras.DatabaseAccesssor.Dapper 拓展插件 #I2ASYA
    • [新增] Furion.Extras.DatabaseAccessor.PetaPoco 拓展插件 #I2AUGA
    • [新增] 网络请求字符串拓展方法 #I2CPQ0
    • [新增] SqlSugar 拓展新增 PagedList 拓展 #I2CW99
    • [新增] 远程请求支持参数特性验证 #I2CX5L
    • [新增] App.User 获取当前授权用户信息便捷方法 #I2CZLO
    • [新增] 规范化文档可配置功能,支持 appsettings.json 配置 #I2D1K9
    • [新增] 远程请求拦截器添加方法和方法参数 #I2D2CM
    • [新增] 远程请求出错返回默认值支持 #I2D44M
    • [新增] 远程请求 body 参数序列化支持设置 PropertyNamingPolicy #I2D685
    • [新增] 远程服务接口客户端配置 #I2D7PS
    • [新增] AddInjectUseInject 允许自定义 SecurityDefinitionsSwaggerUI #I2DIMG
    • [新增] [SecurityDefine] 默认构造函数 #I2DNXT
    • [新增] AspectDispatchProxy 动态代理类 #I2DO6I
    • [新增] [QueryParameters] 特性,支持一键将 Action 参数添加 [FromQuery] 特性 #I2G8TF
    • [新增] 动态日志配置及拓展方法 #I2GDGD
    • [新增] WebApi 请求谓词默认规则配置功能 #I2M70X
  • 突破性变化

    • [升级] .NET 5 SDK 到 .NET 5.0.2 版本 #I2D0PZ
    • [调整] 框架内所有拓展类命名空间,全部迁移到 Furion.模块.Extensions#I2AH54
    • [调整] Swagger 记住授权存储方式,替换 Session 存储方式为 LocalStorage 方式 #I2AKUA
    • [调整] Furion 框架包描述文件,减少框架体积 #I2APAU
    • [调整] App.CanBeScanTypesApp.EffectiveTypes #I2B0ZR
    • [调整] App.ServiceProvider 属性并移除 App.GetDuplicateXXX 方法 #I2CYZE
    • [调整] Db.GetDuplicateDbContextDb.GetNewDbContext #I2CZ04
    • [调整] Db.GetSqlDispatchProxyDb.GetSqlProxy #I2DO9T
    • [重构] Aop 服务拦截器,支持异步、同步两种方式 #I2B9HQ
    • [重构] 网络请求所有功能 #I2BMR7
  • 问题修复

    • [修复] Swagger 规范化化结果不一致 bug #I2ACF3
    • [修复] 数据库新增或更新忽略空值操作方法报空异常 #I2AB6C
    • [修复] Startup.cs Aop 全局拦截无效 #I2A7T2
    • [修复] Token 过期后自动刷新 Token 无法获取最新的用户信息 bug #I2AWQI
    • [修复] [ApiDescriptionSettings(Tag="xx")] 导致 swagger.json 报错 bug #I2B47R
    • [修复] Mysql sql 数据库查询结果 tinyint 类型转换出错 bug #I2BEBM
    • [修复] 规范化结果多次包裹类型 bug #I2BHHZ
    • [修复] 动态 Api 基元类型数组问题 #I2BMS5
    • [修复] sql 查询枚举类型转换异常 bug #I2BS2Y
    • [修复] string.SqlQuerizeAsync<T1>() 拓展返回错误 bug #I2BSTS
    • [修复] 动态 Api 子类重写父类方法并取别名后 Swagger 异常 bug #I2C9VP
    • [修复] 网络请求 application/json 序列化大小写问题 #I2CRJC
    • [修复] 多数据库定位器实体嵌套关联 bug #I2CVN0
    • [修复] 跨域响应头设置无效 bug #I2CW5T
    • [修复] 远程网络请求代理打印到 MiniProfiler bug #I2CZBC
    • [修复] 远程请求响应拦截器 bug #I2D4DG
    • [修复] SqlSugar 框架 AsQueryable() 一直追加参数 #I2DH1D
    • [修复] 自动刷新 Token 空异常 bug #I2DO29
    • [修复] 生成 JWT Token 不传过期时间出现验证 401 bug #I2DO8L
    • [修复] AppStartup 排序无效 #I2DVD2
    • [修复] 未启用多语言服务时友好异常和验证出现空异常 #I2ECUJ
    • [修复] 数据校验字母和数字组合无法匹配 bug #I2EF2Q
    • [修复] 数据校验手机或固话无效 bug #I2M5IZ
    • [修复] Dapper 拓展解析 SqlConnection 异常 bug #I2M5P2
    • [修复] 开启多语言后,EF 迁移异常 bug #I2M7DT
    • [修复] IEntityTypeBuilder 不支持多重继承 bug #I2PAOD
    • [修复] JwtHandler 设置自动刷新后,匿名访问无法通过 bug #I2SDOX
    • [修复] Dapper 拓展中 SqlServer 数据库获取连接对象类型 bug #PR159
  • 其他更改

    • [优化] 移除 Sql 查询结果映射检查 [NotMapper] 特性机制 #I34XD0
    • [优化] 依赖注入时排除 IDynamicApiController 接口 #I2ECTG
    • [优化] MD5 加密性能 #PR158
  • 文档变化

    • [重构] 文档首页 #I34XBR
    • [新增] 网络请求文档 #I2APGJ
    • [新增] 多语言文档 #I2DOCL
    • [新增] 文档全文搜索引擎 #I34XAW
    • [新增] 全局静态类类型 #I34XB4
    • [新增] 框架可配置选项文档 #I34XB9
    • [新增] 事件总线文档 #I34XBI
    • [新增] 数据加解密文档 #I34XC0
    • [新增] 贡献指南文档 #I34XC8
    • [新增] HttpContext文件上传下载 博客文章 #I34XCB
    • [其他] 文档小调整,小优化
  • 问答答疑

    • [答疑] 跨域设置无效 #I2ASNJ
    • [答疑] MVC 视图无效,原因是 .cshtml 文件没有设置为 内容 #I2AXUU
    • [答疑] Sql 操作可以实现事务吗?#I2B0NX
    • [答疑] IRepository 操作数据库会打开多次数据库连接 #I2BB7B
    • [答疑] 如何进入自定义 AppAuthorizeHandler 断点 #I2BGXY
    • [答疑] SqlSugar 注入问题 #I2C2AQ
    • [答疑] 建议增加 API 签名验证,时效验证 #I2C6ET
    • [答疑] 多数据库多租户同时使用 Add-Migration 报错 #I2CEHS
    • [答疑] ISqlSugarRepository 没有 Getxxx 方法 #I2CJLZ
    • [答疑] cli.ps1 如何将 sql 里的表导出成 model#I2CSUL
    • [答疑] 手动修改 Swagger 终结点路径无效 #I2D608
    • [答疑] DefaultDbContext 不能识别 #I2DCZX
    • [答疑] 各分层项目 Startup.cs 支持 Configuration #I2DDUP
    • [答疑] Aop 无法拦截,无效 #I2DEY8
    • [答疑] mysql 执行 Add-Migration 报错 #I2DSB8\
    • [答疑] Entity 创建时间和是否删除添加默认值 #I2E04H
    • [答疑] swagger 中多个 servers 设置 #I2E0IF
    • [答疑] 全局筛选器 没有执行 #I2E5R4
    • [答疑] 多数据库定位器疑问 #I2E77T
    • [答疑] cli.ps 逆向工程 Mysql 数据库报错 #I2E7I5
    • [答疑] Swagger 开发环境 applicationsettings.json 中文乱码 #I2EAG1
    • [答疑] 增加指定路径程序集映射 #I2EEO2
    • [答疑] 动态编译 cs 脚本文件 #I2EH66
    • [答疑] 自定义中间件,返回的错误没有规范化结果 #I2NV8S
    • [答疑] Swagger 循环引用设置生成文档层级无效 #I2PLQQ
    • [答疑] 配置文件支持 yaml 文件吗? #I2TJ3N
    • [答疑] 修改数据库未 mysql 执行 Add-Migration 报错 #I2VR64
    • [答疑] 多数据库使用定位器时报错 #I2VR8F
    • [答疑] Migration To Oracle 异常 #I2WBYQ
    • [答疑] 开发时显示 Swagger,上线时关闭 Swagger,这需要怎么配置 #I2WOYV
    • [答疑] 兼容 Mvc 复杂验证没有试验成功 #I2X3GV
    • [答疑] Aop 能不能支持无接口的类 #I2X8AS
    • [答疑] 关于 JWT Token 自动刷新问题 #I2YD4K
    • [答疑] 能否增加一个拓展的 Entity,增加一些拓展的属性 #I2YDKT
    • [答疑] Furion 无法还原包,使用Nuget 下载和通过最新的的脚手架下载都提示这个问题 #I30446
    • [答疑] 复杂校验与特性验证不能并行 #I3046U
  • 不做实现

    • [废弃] 引入 Webhook 机制 #I2A3I0
    • [废弃] 增加 blog 存储服务 #I2AMBP
    • [废弃] Blazor Server 环境下 EF 的 DbContext 多线程问题 #I2AMD2
    • [废弃] 希望实现工作单元操作接口(IUnitOfWork)#I2AOR5
    • [废弃] 建议新增 string.ToPagedListAsync() 操作 #I2BZ3Z
    • [废弃] 建议新增 GraphQLOData 功能 #I2C9EH
    • [废弃] 迫切期望支持 CAP 分布式事务 #I2CBRF
    • [废弃] 如何让某个方法或实体变化后,不被 SavingChangesEvent 等拦截 #I2CEM9
    • [废弃] 建议日志封装增加更多拓展,比如:自定义保存日志文件 #I2CW8V
    • [废弃] 对 SqlSugar 的支持,增加 Nuget 脚手架 #I2D91U
    • [废弃] 使用 Middleware 实现反向代理 #I2DKM1
    • [废弃] 支持配置多个 Aop 功能 #I2E6Z2
    • [废弃] 是否计划开发类似网关的功能 #I2PD1L
    • [废弃] waring CS8002: 引用程序集 Furion 没有强名称 #I2WDN2
    • [废弃] Oracle 数据库驱动集成 Devart.Data.Oracle.Entity.EFCore #I2XJIU

v1.7.0(已发布)#

  • 新特性

    • [新增] Furion.Extras.ObjectMapper.Mapster 拓展包 #I29LSJ
    • [新增] Furion.Extras.Logging.Serilog 拓展包 #I2AAN8
    • [新增] Furion.Extras.Web.HttpContext 拓展包 #I29LSM
    • [新增] 内置 Token 刷新机制支持 #I29K57
    • [新增] 动态数据库上下文,支持运行时执行 OnModelCreating #I28UDT
    • [新增] 支持依赖注入排除指定接口 #I29693
    • [新增] 规范化结果返回时间戳字段 #I29697
    • [新增] 基础 CURD 父类操作例子 #I296SR
    • [新增] sql.Change("定位器完整类型名称") 支持 #I29LAB
    • [新增] UpdateIncludeUpdateExclude 忽略空参数支持 #I29VUG
    • [新增] 数据库上下文内置假删除查询过滤器支持 #I29Y2R
    • [新增] 忽略空值排除默认时间格式 #I29VUV
    • [升级] MiniProfiler 组件 #I297R9
  • 突破性变化

    • [调整] AppAuthorizeHandler 授权管道为异步处理 #I29MD9
    • [调整] Swagger 默认启用 JWT 授权支持 #I29LI4
    • [调整] HttpContextUtilities 名称改为 HttpContextLocal #I29KQE
    • [调整] UnifyResultContext 名称改为 UnifyContext #I29LLZ
    • [调整] 只有执行迁移命令才扫描种子数据 #I29E6P
    • [调整] 规范化结果 Successed 属性名为 Succeeded #I29NMV
    • [移除] Mapster 对象组件,采用提供拓展方式 #I29D2M
    • [移除] CacheManager 拓展类 #I29LU1
    • [重构] SaveChanges 拦截器 #I292LO
  • 问题修复

    • [修复] 未注册的数据库上下文也被引用全局查询拦截器 bug #I29ZXJ
    • [修复] 手动返回 BadObjectResultValidationProblemDetails 结果类型时规范化结果失效 bug #I29ZU9
    • [修复] 动态 WebApi KeepNameKeepVerbSplitCamelCase 无效 bug #I29X90
    • [修复] Sql代理 返回 元组 类型出错 bug #I29SMV
    • [修复] 401,403 状态码规范化返回值属性变大写 bug #I29M8Y
    • [修复] HttpContext 空异常 bug #I29LU4
    • [修复] 接口无返回值没有应用规范化结果 bug #I29GT7
    • [修复] 前端 Less 配置文件导致主机启动失败 bug #I29E7P
    • [修复] 执行 sql 结果转泛型后属性重复赋值 bug #I29BUO
    • [修复] Swagger 关闭 MiniProfiler 之后 组中组 失效 #I29789
    • [修复] 未启用规范化结果时异常返回 System.Object 字符 #I2969A
    • [修复] 正数数据验证 0 也验证通过 bug #I2955T
    • [修复] 非泛型类集成泛型接口依赖注入 bug #I294YT
    • [修复] Swagger 不支持 new 覆盖父类的 bug #I28Z1A
    • [修复] JsonSerializerUtility 没有公开 bug #I28WMI
    • [修复] SqlSugar 拓展查询泛型类型注册异常 bug #I28VMT
    • [修复] Furion Tools 不支持生成不同命名空间的实体 bug #I2A175
    • [修复] 全局拦截器无效 bug #I2A7T2
    • [修复] 新增或更新忽略空值空异常 bug #I2AB6C
  • 其他更改

    • [优化] Token 生成加密算法 #I29KIH
  • 文档变化

    • [新增] 日志文档 #I28Y9D
    • [调整] 数据库上下文、实体拦截器、配置、一分钟入门等等文档
  • 问答答疑

    • [问答] Swagger 如何实现授权访问 #I294F2
    • [问答] 如何实现多个数据库多对多实体配置 #I29G6S
    • [问答] 动态 WebApi 支持文件上传吗 #I29R5E
    • [疑问] 多个数据库上下文无法生成迁移代码 #I2A6II
  • 不做实现

    • [废弃] 实现 BuildChange 传入表名 #I292SN
    • [废弃] 执行数据库操作结果不支持属性忽略大小写赋值 #I29DRQ
    • [废弃] 引入 Webhook 机制 #I2A3I0

v1.4.0(已发布)#

  • 新特性

    • [新增] Furion 支持二级虚拟目录部署功能 #I28B77
    • [新增] Furion.Template.RazorWithWebApi 脚手架 #I28QGI
    • [新增] Furion.Template.BlazorWithWebApi 脚手架 #I27Z3O
    • [新增] EFCore 时态查询拓展 #I28AJ
    • [新增] [AppDbContext(连接字符串,数据库类型)] 配置支持 #I28QTB
    • [新增] DateTimeOffsetDateTime 拓展方法 #I27MQA
    • [新增] ValidationTypes 验证正则表达式智能提示 #I2801V
    • [新增] ValiationTypes.WordWithNumber 验证 #I2805
    • [新增] 获取客户端和服务端 IP 地址 #I28QV9
  • 突破性变化

    • [升级] .NET 5.0 版本至 .NET 5.0.1 版本 #I28QU
    • [重构] 视图引擎功能,优化不规范命名和新增字符串模板编译 #I28G0S
    • [重构] 数据库实体查找算法,并优化性能 #I28QUQ
    • [优化] 应用启动初始化性能和数据库第一次自动配置 DbSet 性能
  • 问题修复

    • [修复] 多数据库上下文配置定位器后实体无法正确生成 bug #I2888L
    • [修复] 多租户数据库上下文实体生成 bug #I2891G
    • [修复] 对象验证失败提示消息没有应用 JSON 大小写配置 bug #I27UTX
    • [修复] 仓储 InsertUpdate 方法指定 ignoreNullValues 无效 bug #I27UN6
    • [修复] Controller 派生类如果贴了 [Route] 特性后出现在 Swagger 中 bug #I27TN7
    • [修复] SqlScalar 执行 sql 返回 Nullable 类型出现转换失败 bug #I27S2N
    • [修复] [UnitOfWork] 特性异常 bug #I27MLM
    • [修复] sql 静态执行方式和 sql 高级代理无法监听数据库连接状态 bug #I27M4F
    • [修复] 修复更换 Json 序列化库无效 bug,如替换为 Microsoft.AspNetCore.Mvc.NewtonsoftJson #I27M43
    • [修复] Furion Tools 工具生成模型 bug #I27XI5
    • [修复] 软删除没有生效 bug #I2804I
    • [修复] Furion Tools 识别带多个 \\ 的连接字符串识别 bug #I280TS#PR91
    • [修复] Furion Tools 无法取消生成 bug #I2816M
    • [修复] DateTimeOffset 转本地时间差 8 小时 bug #I28BA9
    • [修复] 启用 bundle js&css 压缩后启动异常 bug #I28KR
    • [修复] ValidationTypes.Required 无效 bug #PR98
    • [修复] 规范化结果OnValidateFailed 参数名拼写错误 bug #PR93#PR92
    • [修复] 授权管道验证失败还显示结果 bug #PR89
  • 其他更改

    • [更新] README.md 友情连接地址 #PR88
    • [更新] 模板脚手架源码,添加 EFCore Tools#PR87
    • [更新] README.md Nuget 图标 #PR85
    • [废弃] 将 List<T>DateTable #PR97
  • 文档变化

    • [新增] 视图引擎模板文档 #I27ZVA
    • [新增] EFCore 时态查询文档 #I28AJ, DOC
    • [更新] 仓储文档书写纰漏 bug #PR90
    • [更新] 选项文档错误 bug #PR86
    • [更新] 实体数据监听器 文档书写错误 bug #PR83
    • [更新] 数据库上下文、多数据库、脚手架等文档
  • 问答答疑

    • [建议] 希望 api 返回的值自动将 null 转为 '' 或 [][#I286IJ](https://gitee.com/dotnetchina/Furion/issues/I286IJ),【已关闭】
    • [建议] 添加网关功能 #I27TP7,【已关闭】
    • [建议] 新增 SqlQuery<T> 获取单条记录方法 #I28M1V,【已关闭】
    • [建议] 希望可以提供集成 Serilog 例子 #I282J4,【已关闭】
    • [疑问] 如何通过特性配置唯一约束 #I2891L,【已关闭】
    • [疑问] 怎么读取 appsettings.json 数组 #I27WU,【已关闭】
    • [疑问] IRepository<TEntity> 出现空异常 #I281IE,【已关闭】
    • [疑问] 规范化接口问题问题 #I28NMZ,【已关闭】
    • [疑问] 统一返回值模型中 OnResponseStatusCodes 未执行 #I28NNL,【已关闭】

v1.2.0(已发布)#

  • 新特性

    • [新增] 雪花算法 #I26OXG, #PR78
    • [新增] [AppDbContext] 配置数据库提供器支持 #I27G3T
    • [新增] 实体表数据更改监听接口 IEntityDataChangedListener #I278DD, #I278LQ
    • [新增] 全局服务接口 AOP 拦截功能 #I278CP
    • [新增] 定位器仓储 IDbRepository<TDbContextLocator> #I276Q3
    • [新增] 数据库操作 InsertOrUpdate 支持排除空字符串功能 #I272OG
    • [新增] 数据库操作 UpdateIncludeUpdateExclude 匿名对象支持 #I271X0
    • [新增] 数据验证传入空对象跳过验证支持 #I273R4
    • [新增] 应用启动时支持排除特定配置文件自动加载 #I26U0A
    • [新增] 单个实体表名前缀支持 #I26LX0
    • [新增] MySql 数据库自动配置默认版本号 #I26XQ6
    • [优化] 授权处理程序代码
  • 突破性变化

    • [新增] 实体表数据更改监听接口 IEntityDataChangedListener #I278DD, #I278LQ
    • [新增] 全局服务接口 AOP 拦截功能 #I278CP
    • [新增] 雪花算法 #I26OXG, #PR78
  • 问题修复

    • [修复] 视图引擎加载外部程序集出错 bug
    • [修复] 依赖注入代理接口报空对象异常 bug
    • [修复] EFCore 取消附加实体出错 bug
    • [修复] 数据库仓储在非 Web 请求下出现空异常 bug
    • [修复] 多个授权策略共存问题出现无效 bug
    • [修复] 友好异常 Oop.Oh 不支持普通方法 bug
    • [修复] 获取多租户对象时数据库上下文出现作用域验证失败 bug
    • [修复] 工作单元不支持 Sql代理 拦截 bug #I27GST
  • 其他更改

  • 文档变化


v1.1.0(已发布)#

  • 新特性

    • [新增] Db.GetDbContext() 获取默认数据库上下文方法
    • [新增] HttpContextUtility.GetCurrentHttpContext() 获取全局 HttpContext 上下文
    • [新增] App.GetRequiredService<> 解析服务方法
    • [新增] object.GetService<> 对象拓展方法
    • [新增] 策略授权 PolicyPipeline 基类方法,支持多重判断授权
    • [新增] JWTEncryption.ValidateJwtBearerToken 手动验证静态方法
    • [新增] 全局数据库上下文 InsertOrUpdateIgnoreNullValuesEnabledEntityStateTracked 全局配置
    • [新增] Swagger Jwt授权 全局授权参数 #I26GLR
    • [新增] InsertOrUpdate 支持自定义判断条件功能 #I269Q1
    • [新增] 字符串字段小写命名支持 #I2695D
    • [新增] 字符串文本对比功能 #I268LE
    • [新增] 全局异常特性消息功能 #I2662O
    • [新增] InsertUpdate 数据库忽略空值功能 #I264Q4
  • 突破性变化

    • [调整] Fur 项目名为 Furion
    • [调整] Db.GetRequestDbContext<>() 命名为 Db.GetDbContext<>()
    • [调整] Db.GetDbContext<>() 命名为 Db.GetDuplicateDbContext<>()
    • [重构] App.GetService<> 解析服务的底层逻辑,大大提高了解析服务的性能
    • [重构] 授权核心代码,保持和微软一致的授权规范 #I26DCB
    • [移除] App.GetRequestService<> 方法
    • [移除] ValidateJwtBearer Jwt 授权方法,无需手动判断了
  • 问题修复

    • [修复] Furion 官方脚手架生成后编译异常 bug
    • [修复] Tenant 内置属性不是 virtual 修饰 bug
    • [修复] dockerfile 新命名构建失败 bug
    • [修复] 自定义角色授权和多个授权共存出现 403 bug #I26H1L
    • [修复] httpContext.GetEndpoint() 空异常 bug #PR73
    • [修复] Oops.Oh 空异常和不支持服务服务抛异常 bug #I26EFU#I26GM4
    • [修复] cli.ps 生成文件编码乱码 bug #I26DVT
    • [修复] Swagger 文件上传按钮不显示 #I26B6U
    • [修复] 规范化结果授权状态码序列化大小写不一致问题 #I26B26
    • [修复] 未启用规范化结果时中文乱码 bug #I268T5
    • [修复] MySql 异步异常捕获不到 bug #I265SO
    • [修复] cli.ps1 提示找不到数据库连接字符串 bug #I2647U
  • 其他更改

  • 文档变化

    • [更新] 一分钟入门、安全鉴权、数据库等文档

v1.0.3(已发布)#

  • 新特性

    • [新增] Mvc 模板脚手架:Fur.Template.Mvc
    • [新增] WebApi 模板:Fur.Template.Api
    • [新增] Mvc/WebApi 模板:Fur.Template.App
    • [新增] Razar Pages 模板:Fur.Template.Razor
    • [新增] Blazor 模板:Fur.Template.Blazor
  • 突破性变化

    • [调整] PagedListSystem.Collections.Generic 命名空间下
    • [优化] 解析服务性能问题,底层代码大量优化
  • 问题修复

    • [修复] ApiSears.ControllerEnd不起作用 bug #I25KH6
    • [修复] RemoteRequest 请求完成结果序列化属性大小写问题 #I25I8R
    • [修复] HttpContext.GetEndpoinet() 空异常 bug #PR73
  • 其他更改

  • 文档变化

    • [更新] 入门文档、数据库上下文文档、多数据库操作文档

v1.0.2(已发布)#

  • 新特性

    • [新增] Pomelo.EntityFrameworkCore.MySql 最新 .NET 5 包配置 #I24ZQK
    • [新增] .AddDateTimeJsonConverter(format) 时间格式序列化配置
    • [新增] DateTimeDateTimeOffset 类型序列化格式配置 #I253FI
  • 突破性变化

    • [更新] Mapster 包至 7.0.0
    • [调整] App.Services 名为 App.ServiceProvider
    • [移除] App.ApplicationServicesApp.GetRequestService<>()
    • [移除] 非 Web 主机注入拓展
  • 问题修复

    • [修复] services.AddFriendlyException() 缺少配置注入 bug
    • [修复] 数据库上下文池被释放和高并发下内存溢出 bug #I2524K#I24UMN
    • [修复] Sql代理 返回空数据时异常 bug #I24TCK
    • [修复] 工作单元 [UnitOfWork] 多数据库被释放 bug #I24Q6W
  • 其他更改

    • [调整] EntityBaseEntity 所有属性为 vitural 修饰
    • [优化] Jwt 读取和解析性能
    • [优化] 优化代码支持 C# 9.0 最新语法
    • [优化] MD5 加密性能 #PR71
    • [移除] 无用或未使用代码
  • 文档

    • [更新] 数据库上下文、多数据库、一分钟入门文档

v1.0.0(已发布)#

  • 新特性

    • [新增] 网络请求 RemoteRequest 组件 #I1YYWD
    • [新增] .AddInjectBase() 注入,只包含基础服务注入
    • [新增] 所有服务都支持 IServiceCollectionIMvcBuilder 注入
    • [新增] 抛异常状态码设置功能 StatusCode
    • [新增] Swagger 序列化支持 Pascal 属性命名方式
  • 突破性变化

    • [更新] 所有的包为 .NET 5 正式版
  • 问题修复

    • [修复] SqlProxy 代理异步处理 bug
    • [修复] 数据库类型 DatetimeDateTimeOffset bug
    • [修复] 属性首字母大小写序列化不匹配出现 null bug
    • [修复] 对象序列化中文出现乱码 bug
    • [修复] 默认序列化配置无效 bug
    • [修复] 数据库非依赖注入方式提交无效 bug
    • [修复] 应用程序池提交所有 DbContext 空异常 bug
    • [修复] Saas 多租户 Tenant 类型字符串属性在 MySql 数据库下出现 longtext 类型 bug
    • [修复] Mvc 自动验证字符串空值 bug #I24M2T
    • [修复] 枚举注释被覆盖 bug #I24N6J
    • [修复] 忽略规范化结果无效 bug #I24B8P
    • [修复] Swagger 默认 ContentType 不是 applicaiton/json bug #I24F3U
    • [修复] 内置 System.Text.JsonNewtonsoft.Json 冲突 bug #I24F3U
  • 其他更改

    • [调整] Fur 框架域名为:https://furion.pro
    • [调整] 仓储 FromSqlRawFromSqlInterpolated 接口位置
    • [优化] 数据加解密性能,#PR70
  • 文档

    • [更新] README.md、框架介绍、数据库上下文、配置选项、多租户、跨域文档
Last updated on by Monk
+
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

1.6 更新日志

此章节只记录重大版本更新日志,小迭代版本不做更新。想了解更多更新内容,可查阅 CHANGELOG.md

v1.17.0 (当前版本)#

  • 新特性

    • [新增] 动态 WebAPI 支持继承基类配置特性 #I3D5PX
    • [新增] 远程请求支持 multipart/form-data 内容类型处理 #I3D7KG
    • [新增] 字符串加密拓展 #I3DHBW
    • [新增] 新增远程请求可直接下载返回值内容转为 string 类型 #I3DIGR
    • [新增] 远程请求地址支持模板引擎 #I3D5Y8
    • [新增] [DataValidation] 错误消息支持 string.Format 操作 #I3E08W
    • [新增] 远程请求 HttpRequestMessage 拓展方法 AppendQueries() 追加更多 query 参数拓展 #I3E3DI
  • 突破性变化

    • [调整] IRepository.AsAsyncEnumerable() 返回值 #I3DIQ1,调整为:rep.AsQueryable().ToListAsync()
  • 问题修复

    • [修复] 数据验证失败后也打印了成功的字段 #I3CVBS
    • [修复] 远程请求配置 contentTypeapplication/x-www-form-urlencoded 无效问题#I3CWBS
    • [修复] 远程请求无法打印完整的请求地址,比如配置了 HttpClient 之后 #I3CY42
    • [修复] 程序启动时排除默认配置文件算法不对,应该采用正则表达式匹配 #I3D9E7
    • [修复] 远程请求成功请求拦截不生效 #I3DOE4
    • [修复] Dapper 拓展数据库切换为 oracle 时,系统找不到指定的文件 Oracle.ManagedDataAccess.Core #I3DYM3
  • 其他更改

    • [改进] 获取 JWT token 信息支持配置 Token 前缀,如 Bearer #I3DJIV
    • [改进] 刷新 Token 黑名单存储方式,将内存缓存调整为分布式缓存 #I3DPBR
  • 文档变化

    • [调整] 远程请求文档 #I3CPJO
  • 问答答疑

    • [答疑] LinqExpression.And 没有 2 个参数的方法 #I3CXKZ
    • [答疑] 异常信息 如何记录到数据库中:) #I3DDGO
    • [答疑] 无键实体选用 IEntityNotKey #I3DWRF
    • [答疑] 根据主键删除一条记录不成功,无错误信息 #I3DWWF
    • [答疑] 如何自定义接口返回格式 #I3DZN6
    • [答疑] DynamicApiController 如何在运行时决定是否公开一个 Action #I3D5UL
    • [答疑] Furion.DatabaseAccessor.DbHelpers 方法:ConvertToDbParameters 是不是应该过滤掉贴 NotMapped 的特性 #I3E2XS
  • 不做实现

    • [废弃] 框架是否提供 ISoftDelete 类似接口 #I3CP93

v1.16.0 (已发布)#

  • 新特性

    • [新增] IDGenerator 雪花 ID 算法,感谢 idgenerator 作者提交 PR #PR204 #I3B60S
    • [新增] DbContext 刷新多租户缓存拓展方法 #I39N5U
    • [新增] 自定义配置单个控制器名称规范,如小写路由 #I3A5XL
    • [新增] 获取当前选择区域语言方法 #I3BSDH
  • 突破性变化

    • [升级] .NET 5 SDK 至 5.0.4 版本 #I3ASTL
    • [重构] 远程请求所有功能 #I2LB7M
    • [重构] JSON 序列化功能,提供统一的抽象接口,方便自由替换 JSON#I39GT9
    • [重构] 验证失败返回消息模型及规范化接口验证参数 #I3AFQW
    • [优化] 插件式开发热插拔功能,实现动态加载卸载 #PR200, 感谢 @SamWangCoder
    • [移除] 移除 JsonSerializerUtility 静态类及移除属性大写序列化拓展配置 #I3AFRJ
  • 问题修复

    • [修复] MVC 模式下不支持验证自定义验证逻辑 #I39LM5
    • [修复] 验证数值类型正则表达式不支持负数 bug #I39YUV
    • [修复] 框架启动时无法加载未被引用的程序集 bug #I3A3Z4
    • [修复] EFCoreRepository.IsAttached() 方法判断错误 bug #I3A824
    • [修复] 动态API 驼峰显示配置无效 bug #I3AF32
    • [修复] cli.ps1 不支持新版本 EFCore bug #I3APO9
    • [修复] EFCore 实体配置 [Table] 特性无效 bug #I3BAYH
    • [修复] 动态 WebAPI CheckIsSplitCamelCase bug #I3BLKX
    • [修复] 修复动态 WebAPI 配置保留 Action 的 Async 后缀无效问题 #I3C3DA
    • [修复] JWT Token 刷新后旧的刷新 Token 依旧可用 bug #I3C8ZH
    • [修复] 多语言 Razor 视图变量多语言乱码问题 #I3CBMU
  • 其他更改

    • [优化] 默认序列化提供器 System.Text.Json 反序列化字符串时区分大小写问题 #I3BSXV
    • [优化] 优化 MessageCenter 性能问题 #I39PRR
    • [优化] 数据库上下文池小性能优化
  • 文档变化

    • [新增] Docker 环境下自动化部署 #PR209
    • [新增] JSON 序列化 文档 #I3B6D8
    • [更新] 跨域、安全授权、即时通信文档、多语言、规范化文档
  • 问答答疑

    • [答疑] Furion.Extras.DatabaseAccessor.SqlSugar 配置多个数据库打印 SQL 语句问题 #I39PDC
    • [答疑] ORACLE 数据库多租户模式下返回值为指定类型时系统卡死 #I39RNH
    • [答疑] 假删除指向异常 #I39XZA
    • [答疑] Furion 多语言配置节是放在 AppSettings 里面还是外面呢? #I3A4SB
    • [答疑] 没找到数据库上下文 #I3A5HS
    • [答疑] 有 QQ 交流群吗? #I3AAM7
    • [答疑] Vue3 环境下配置 SignalR 跨域出错 #I3ALQ7
    • [答疑] 设置 Swagger 参数非必填 #I3AT02
    • [答疑] EFCore 调用 Insert 时报 Unknown column 'Discriminator' in 'field list' 异常 #I3B2LC
    • [答疑] 逆向 mysql 数据库时 cli 出现错误 #I3B64F
    • [答疑] Sql 高级代理使用过程中 DateTime 类型的参数序列化失败 #I3AZXK
    • [答疑] 使用 Mysql 执行 Add-Migration 报错 #I3B8EW
    • [答疑] Saas 多租户模式-独立 Database 模式下无法获取 Tenant, 导致无法自动切换的问题#I3AVXU
    • [答疑] 如何自定义 WebAPI 统一结果模型 #I3BBYW #I3BBYV
    • [答疑] 在 Web.Entry 项目新建了一个 Controller,多了未知方法 #I3BKH5
    • [答疑] AOP 拦截如何解析服务 #I3BUM3
    • [答疑] 动态 WebAPI 返回参数被省略 #I3C2XR
    • [答疑] 如何设置某一个接口响应数据不自动转小写,按原始字段名返回 #I38L9B
    • [答疑] code first 如何配置自动迁移 #I3CCR0
    • [答疑] webapi 混合授权如何区分不同系统 #I3CJCY
    • [答疑] EFCore 不支持递归无限级遍历关系 #I3CET9
  • 不做实现

    • [废弃] 建议 EFCore 可配置外键关系导航问题 #I3994X
    • [废弃] 建议将 EFCore 剥离出来,作为插件的形式提供。这样可以选择自己喜欢的 ORM #I3ABNX
    • [废弃] 事件总线能否提供返回值 #I3AWL6
    • [废弃] Sql 模板能仿照 Mybatis 一样加各种标签吗?#I3ASRS
    • [废弃] EFCore 更新或排除更新指定列支持传入 DTO 模型 #I3AS5K
    • [废弃] 新增 UnitOfWork 事务完成事件 #I3BRMI

v1.15.0 (已发布)#

  • 新特性

    • [新增] 跳过特定实体数据库操作监听特性 #I386LB
    • [新增] IEntityChangedListener 增加对 OldEntity 的支持 #I385X2
    • [新增] 实时通信自动配置集线器拓展及特性 #I387QX
    • [新增] Mapster 拓展支持 IMapper 依赖注入方式 #I38C7C
    • [新增] [AppDbContext] 特性默认构造函数 #I38J97
    • [新增] UnifyContext.GetExceptionMetadata(context) 返回错误码支持 #I38ONX
  • 突破性变化

  • 问题修复

    • [修复] 多次循环中调用 Db.GetNewDbContext() 还是获取到同一个对象 #I38NNP
    • [修复] Swagger 过滤掉 object 类型属性问题 #I38FHL
    • [修复] 同一类不支持多继承 IEntityChangedListener 问题 #I38UQJ
    • [修复] 自定义序列化属性名称导致验证失败属性不匹配问题 #I38W8Z
  • 其他更改

    • [优化] 代码不规范命名导致开发者阅读代码时产生歧义
  • 文档变化

    • [新增] FluentValidation 集成文档 #I38IOT
  • 问答答疑

    • [答疑] Furion 框架版本向下兼容问题 #I38WMZ
  • 不做实现

    • [废弃] 建议 SqlSugar 添加动态切换数据库功能 #I38G4M
    • [废弃] 建议 MessageCenter 采用 Channel 实现 #I38BP8
    • [废弃] 建议接口文档整合 Knife4jUI 或 Redoc #I38S70

v1.14.0(已发布)#

  • 新特性

    • [新增] EFCore 5.0 的 Oracle 数据库支持 #I37Z8E
    • [新增] 控制是否在开发环境下显示数据库连接信息 #I37YQ2
    • [新增] [NonUnify] 支持在类中贴此特性 #I359Q6
    • [新增] 网络请求 字符串 HttpClient 拦截器 #I35F3E
    • [新增] HttpContextHttpRequest 获取远程地址拓展 #I3688Z
    • [新增] services.AddMvcFilter<> 添加 Mvc 过滤器拓展 #I368BH
  • 突破性变化

    • [升级] 框架依赖的 .NET 5 SDK 至最新版 5.0.3 #I37YQQ
    • [升级] Swashbuckle.AspNetCore 组件包到 6.0.x 版本 #I37EZK
    • [移除] Furion 框架 JWT 拓展类,只在 Furion.Extras.Authentication.JwtBearer 中保留 #I35D59
  • 问题修复

    • [修复] 传入错误 JWT Token 字符串导致自动刷新 Token 出现字符串边界值异常 bug #I34ZE5
    • [修复] 瞬时作用域数据库上下文也会自动加入工作单元导致写日志时连锁异常 bug #I37WTV
  • 其他更改

    • [优化] 获取系统环境参数的性能 #I36SR5
    • [优化] Furion 底层添加 Mvc 过滤器代码 #I36SKA
    • [优化] 添加默认 Json 序列化时间默认时间格式 #I36SL0
    • [升级] 升级 SqlSugar 拓展包到 5.0.2.6 版本 #I36SIG
  • 文档变化

    • [新增] 数据库入门文档 #I37Z8S
    • [新增] 更新日志文档 #I36PI0
    • [新增] 请求审计日志、执行 Sql 更新日志文档 #I36PIK
    • [新增] 前端使用 axios 跨域配置文档 #I36PIT
    • [新增] App 静态类获取应用、环境更多信息数据 #I36SOV
    • [新增] 英文版 README.md 介绍 #I37QHP
  • 问答答疑

  • 不做实现

    • [废弃] 多语言资源文件自动创建 #I35AA4
    • [废弃] 建议多语言加上维吾尔语支持 #I37X1L

v1.13.0(已发布)#

  • 新特性

    • [新增] 多语言功能及拓展 #I2DOCL
    • [新增] 事件总线功能及消息中心 #I23BKN
    • [新增] Swagger 分组显示隐藏配置 #I2AHH8
    • [新增] Furion.Extras.Logging.Serilog 拓展插件 #I2AAN8
    • [新增] cli.ps 支持 -Namespace 命名空间指定 #I2A175
    • [新增] Swagger 规范化化文档授权失效后自动取消授权锁 #I2AIWC
    • [新增] Request.Body 支持重复读功能,主要解决微信 SDK 问题 #I2AMG0
    • [新增] 网络请求功能及文档 #I2APGJ
    • [新增] SqlSugar 拓展包支持打印 sqlMiniProfiler#I2ASLS
    • [新增] Furion.Extras.DatabaseAccesssor.Dapper 拓展插件 #I2ASYA
    • [新增] Furion.Extras.DatabaseAccessor.PetaPoco 拓展插件 #I2AUGA
    • [新增] 网络请求字符串拓展方法 #I2CPQ0
    • [新增] SqlSugar 拓展新增 PagedList 拓展 #I2CW99
    • [新增] 远程请求支持参数特性验证 #I2CX5L
    • [新增] App.User 获取当前授权用户信息便捷方法 #I2CZLO
    • [新增] 规范化文档可配置功能,支持 appsettings.json 配置 #I2D1K9
    • [新增] 远程请求拦截器添加方法和方法参数 #I2D2CM
    • [新增] 远程请求出错返回默认值支持 #I2D44M
    • [新增] 远程请求 body 参数序列化支持设置 PropertyNamingPolicy #I2D685
    • [新增] 远程服务接口客户端配置 #I2D7PS
    • [新增] AddInjectUseInject 允许自定义 SecurityDefinitionsSwaggerUI #I2DIMG
    • [新增] [SecurityDefine] 默认构造函数 #I2DNXT
    • [新增] AspectDispatchProxy 动态代理类 #I2DO6I
    • [新增] [QueryParameters] 特性,支持一键将 Action 参数添加 [FromQuery] 特性 #I2G8TF
    • [新增] 动态日志配置及拓展方法 #I2GDGD
    • [新增] WebApi 请求谓词默认规则配置功能 #I2M70X
  • 突破性变化

    • [升级] .NET 5 SDK 到 .NET 5.0.2 版本 #I2D0PZ
    • [调整] 框架内所有拓展类命名空间,全部迁移到 Furion.模块.Extensions#I2AH54
    • [调整] Swagger 记住授权存储方式,替换 Session 存储方式为 LocalStorage 方式 #I2AKUA
    • [调整] Furion 框架包描述文件,减少框架体积 #I2APAU
    • [调整] App.CanBeScanTypesApp.EffectiveTypes #I2B0ZR
    • [调整] App.ServiceProvider 属性并移除 App.GetDuplicateXXX 方法 #I2CYZE
    • [调整] Db.GetDuplicateDbContextDb.GetNewDbContext #I2CZ04
    • [调整] Db.GetSqlDispatchProxyDb.GetSqlProxy #I2DO9T
    • [重构] Aop 服务拦截器,支持异步、同步两种方式 #I2B9HQ
    • [重构] 网络请求所有功能 #I2BMR7
  • 问题修复

    • [修复] Swagger 规范化化结果不一致 bug #I2ACF3
    • [修复] 数据库新增或更新忽略空值操作方法报空异常 #I2AB6C
    • [修复] Startup.cs Aop 全局拦截无效 #I2A7T2
    • [修复] Token 过期后自动刷新 Token 无法获取最新的用户信息 bug #I2AWQI
    • [修复] [ApiDescriptionSettings(Tag="xx")] 导致 swagger.json 报错 bug #I2B47R
    • [修复] Mysql sql 数据库查询结果 tinyint 类型转换出错 bug #I2BEBM
    • [修复] 规范化结果多次包裹类型 bug #I2BHHZ
    • [修复] 动态 Api 基元类型数组问题 #I2BMS5
    • [修复] sql 查询枚举类型转换异常 bug #I2BS2Y
    • [修复] string.SqlQuerizeAsync<T1>() 拓展返回错误 bug #I2BSTS
    • [修复] 动态 Api 子类重写父类方法并取别名后 Swagger 异常 bug #I2C9VP
    • [修复] 网络请求 application/json 序列化大小写问题 #I2CRJC
    • [修复] 多数据库定位器实体嵌套关联 bug #I2CVN0
    • [修复] 跨域响应头设置无效 bug #I2CW5T
    • [修复] 远程网络请求代理打印到 MiniProfiler bug #I2CZBC
    • [修复] 远程请求响应拦截器 bug #I2D4DG
    • [修复] SqlSugar 框架 AsQueryable() 一直追加参数 #I2DH1D
    • [修复] 自动刷新 Token 空异常 bug #I2DO29
    • [修复] 生成 JWT Token 不传过期时间出现验证 401 bug #I2DO8L
    • [修复] AppStartup 排序无效 #I2DVD2
    • [修复] 未启用多语言服务时友好异常和验证出现空异常 #I2ECUJ
    • [修复] 数据校验字母和数字组合无法匹配 bug #I2EF2Q
    • [修复] 数据校验手机或固话无效 bug #I2M5IZ
    • [修复] Dapper 拓展解析 SqlConnection 异常 bug #I2M5P2
    • [修复] 开启多语言后,EF 迁移异常 bug #I2M7DT
    • [修复] IEntityTypeBuilder 不支持多重继承 bug #I2PAOD
    • [修复] JwtHandler 设置自动刷新后,匿名访问无法通过 bug #I2SDOX
    • [修复] Dapper 拓展中 SqlServer 数据库获取连接对象类型 bug #PR159
  • 其他更改

    • [优化] 移除 Sql 查询结果映射检查 [NotMapper] 特性机制 #I34XD0
    • [优化] 依赖注入时排除 IDynamicApiController 接口 #I2ECTG
    • [优化] MD5 加密性能 #PR158
  • 文档变化

    • [重构] 文档首页 #I34XBR
    • [新增] 网络请求文档 #I2APGJ
    • [新增] 多语言文档 #I2DOCL
    • [新增] 文档全文搜索引擎 #I34XAW
    • [新增] 全局静态类类型 #I34XB4
    • [新增] 框架可配置选项文档 #I34XB9
    • [新增] 事件总线文档 #I34XBI
    • [新增] 数据加解密文档 #I34XC0
    • [新增] 贡献指南文档 #I34XC8
    • [新增] HttpContext文件上传下载 博客文章 #I34XCB
    • [其他] 文档小调整,小优化
  • 问答答疑

    • [答疑] 跨域设置无效 #I2ASNJ
    • [答疑] MVC 视图无效,原因是 .cshtml 文件没有设置为 内容 #I2AXUU
    • [答疑] Sql 操作可以实现事务吗?#I2B0NX
    • [答疑] IRepository 操作数据库会打开多次数据库连接 #I2BB7B
    • [答疑] 如何进入自定义 AppAuthorizeHandler 断点 #I2BGXY
    • [答疑] SqlSugar 注入问题 #I2C2AQ
    • [答疑] 建议增加 API 签名验证,时效验证 #I2C6ET
    • [答疑] 多数据库多租户同时使用 Add-Migration 报错 #I2CEHS
    • [答疑] ISqlSugarRepository 没有 Getxxx 方法 #I2CJLZ
    • [答疑] cli.ps1 如何将 sql 里的表导出成 model#I2CSUL
    • [答疑] 手动修改 Swagger 终结点路径无效 #I2D608
    • [答疑] DefaultDbContext 不能识别 #I2DCZX
    • [答疑] 各分层项目 Startup.cs 支持 Configuration #I2DDUP
    • [答疑] Aop 无法拦截,无效 #I2DEY8
    • [答疑] mysql 执行 Add-Migration 报错 #I2DSB8\
    • [答疑] Entity 创建时间和是否删除添加默认值 #I2E04H
    • [答疑] swagger 中多个 servers 设置 #I2E0IF
    • [答疑] 全局筛选器 没有执行 #I2E5R4
    • [答疑] 多数据库定位器疑问 #I2E77T
    • [答疑] cli.ps 逆向工程 Mysql 数据库报错 #I2E7I5
    • [答疑] Swagger 开发环境 applicationsettings.json 中文乱码 #I2EAG1
    • [答疑] 增加指定路径程序集映射 #I2EEO2
    • [答疑] 动态编译 cs 脚本文件 #I2EH66
    • [答疑] 自定义中间件,返回的错误没有规范化结果 #I2NV8S
    • [答疑] Swagger 循环引用设置生成文档层级无效 #I2PLQQ
    • [答疑] 配置文件支持 yaml 文件吗? #I2TJ3N
    • [答疑] 修改数据库未 mysql 执行 Add-Migration 报错 #I2VR64
    • [答疑] 多数据库使用定位器时报错 #I2VR8F
    • [答疑] Migration To Oracle 异常 #I2WBYQ
    • [答疑] 开发时显示 Swagger,上线时关闭 Swagger,这需要怎么配置 #I2WOYV
    • [答疑] 兼容 Mvc 复杂验证没有试验成功 #I2X3GV
    • [答疑] Aop 能不能支持无接口的类 #I2X8AS
    • [答疑] 关于 JWT Token 自动刷新问题 #I2YD4K
    • [答疑] 能否增加一个拓展的 Entity,增加一些拓展的属性 #I2YDKT
    • [答疑] Furion 无法还原包,使用Nuget 下载和通过最新的的脚手架下载都提示这个问题 #I30446
    • [答疑] 复杂校验与特性验证不能并行 #I3046U
  • 不做实现

    • [废弃] 引入 Webhook 机制 #I2A3I0
    • [废弃] 增加 blog 存储服务 #I2AMBP
    • [废弃] Blazor Server 环境下 EF 的 DbContext 多线程问题 #I2AMD2
    • [废弃] 希望实现工作单元操作接口(IUnitOfWork)#I2AOR5
    • [废弃] 建议新增 string.ToPagedListAsync() 操作 #I2BZ3Z
    • [废弃] 建议新增 GraphQLOData 功能 #I2C9EH
    • [废弃] 迫切期望支持 CAP 分布式事务 #I2CBRF
    • [废弃] 如何让某个方法或实体变化后,不被 SavingChangesEvent 等拦截 #I2CEM9
    • [废弃] 建议日志封装增加更多拓展,比如:自定义保存日志文件 #I2CW8V
    • [废弃] 对 SqlSugar 的支持,增加 Nuget 脚手架 #I2D91U
    • [废弃] 使用 Middleware 实现反向代理 #I2DKM1
    • [废弃] 支持配置多个 Aop 功能 #I2E6Z2
    • [废弃] 是否计划开发类似网关的功能 #I2PD1L
    • [废弃] waring CS8002: 引用程序集 Furion 没有强名称 #I2WDN2
    • [废弃] Oracle 数据库驱动集成 Devart.Data.Oracle.Entity.EFCore #I2XJIU

v1.7.0(已发布)#

  • 新特性

    • [新增] Furion.Extras.ObjectMapper.Mapster 拓展包 #I29LSJ
    • [新增] Furion.Extras.Logging.Serilog 拓展包 #I2AAN8
    • [新增] Furion.Extras.Web.HttpContext 拓展包 #I29LSM
    • [新增] 内置 Token 刷新机制支持 #I29K57
    • [新增] 动态数据库上下文,支持运行时执行 OnModelCreating #I28UDT
    • [新增] 支持依赖注入排除指定接口 #I29693
    • [新增] 规范化结果返回时间戳字段 #I29697
    • [新增] 基础 CURD 父类操作例子 #I296SR
    • [新增] sql.Change("定位器完整类型名称") 支持 #I29LAB
    • [新增] UpdateIncludeUpdateExclude 忽略空参数支持 #I29VUG
    • [新增] 数据库上下文内置假删除查询过滤器支持 #I29Y2R
    • [新增] 忽略空值排除默认时间格式 #I29VUV
    • [升级] MiniProfiler 组件 #I297R9
  • 突破性变化

    • [调整] AppAuthorizeHandler 授权管道为异步处理 #I29MD9
    • [调整] Swagger 默认启用 JWT 授权支持 #I29LI4
    • [调整] HttpContextUtilities 名称改为 HttpContextLocal #I29KQE
    • [调整] UnifyResultContext 名称改为 UnifyContext #I29LLZ
    • [调整] 只有执行迁移命令才扫描种子数据 #I29E6P
    • [调整] 规范化结果 Successed 属性名为 Succeeded #I29NMV
    • [移除] Mapster 对象组件,采用提供拓展方式 #I29D2M
    • [移除] CacheManager 拓展类 #I29LU1
    • [重构] SaveChanges 拦截器 #I292LO
  • 问题修复

    • [修复] 未注册的数据库上下文也被引用全局查询拦截器 bug #I29ZXJ
    • [修复] 手动返回 BadObjectResultValidationProblemDetails 结果类型时规范化结果失效 bug #I29ZU9
    • [修复] 动态 WebApi KeepNameKeepVerbSplitCamelCase 无效 bug #I29X90
    • [修复] Sql代理 返回 元组 类型出错 bug #I29SMV
    • [修复] 401,403 状态码规范化返回值属性变大写 bug #I29M8Y
    • [修复] HttpContext 空异常 bug #I29LU4
    • [修复] 接口无返回值没有应用规范化结果 bug #I29GT7
    • [修复] 前端 Less 配置文件导致主机启动失败 bug #I29E7P
    • [修复] 执行 sql 结果转泛型后属性重复赋值 bug #I29BUO
    • [修复] Swagger 关闭 MiniProfiler 之后 组中组 失效 #I29789
    • [修复] 未启用规范化结果时异常返回 System.Object 字符 #I2969A
    • [修复] 正数数据验证 0 也验证通过 bug #I2955T
    • [修复] 非泛型类集成泛型接口依赖注入 bug #I294YT
    • [修复] Swagger 不支持 new 覆盖父类的 bug #I28Z1A
    • [修复] JsonSerializerUtility 没有公开 bug #I28WMI
    • [修复] SqlSugar 拓展查询泛型类型注册异常 bug #I28VMT
    • [修复] Furion Tools 不支持生成不同命名空间的实体 bug #I2A175
    • [修复] 全局拦截器无效 bug #I2A7T2
    • [修复] 新增或更新忽略空值空异常 bug #I2AB6C
  • 其他更改

    • [优化] Token 生成加密算法 #I29KIH
  • 文档变化

    • [新增] 日志文档 #I28Y9D
    • [调整] 数据库上下文、实体拦截器、配置、一分钟入门等等文档
  • 问答答疑

    • [问答] Swagger 如何实现授权访问 #I294F2
    • [问答] 如何实现多个数据库多对多实体配置 #I29G6S
    • [问答] 动态 WebApi 支持文件上传吗 #I29R5E
    • [疑问] 多个数据库上下文无法生成迁移代码 #I2A6II
  • 不做实现

    • [废弃] 实现 BuildChange 传入表名 #I292SN
    • [废弃] 执行数据库操作结果不支持属性忽略大小写赋值 #I29DRQ
    • [废弃] 引入 Webhook 机制 #I2A3I0

v1.4.0(已发布)#

  • 新特性

    • [新增] Furion 支持二级虚拟目录部署功能 #I28B77
    • [新增] Furion.Template.RazorWithWebApi 脚手架 #I28QGI
    • [新增] Furion.Template.BlazorWithWebApi 脚手架 #I27Z3O
    • [新增] EFCore 时态查询拓展 #I28AJ
    • [新增] [AppDbContext(连接字符串,数据库类型)] 配置支持 #I28QTB
    • [新增] DateTimeOffsetDateTime 拓展方法 #I27MQA
    • [新增] ValidationTypes 验证正则表达式智能提示 #I2801V
    • [新增] ValiationTypes.WordWithNumber 验证 #I2805
    • [新增] 获取客户端和服务端 IP 地址 #I28QV9
  • 突破性变化

    • [升级] .NET 5.0 版本至 .NET 5.0.1 版本 #I28QU
    • [重构] 视图引擎功能,优化不规范命名和新增字符串模板编译 #I28G0S
    • [重构] 数据库实体查找算法,并优化性能 #I28QUQ
    • [优化] 应用启动初始化性能和数据库第一次自动配置 DbSet 性能
  • 问题修复

    • [修复] 多数据库上下文配置定位器后实体无法正确生成 bug #I2888L
    • [修复] 多租户数据库上下文实体生成 bug #I2891G
    • [修复] 对象验证失败提示消息没有应用 JSON 大小写配置 bug #I27UTX
    • [修复] 仓储 InsertUpdate 方法指定 ignoreNullValues 无效 bug #I27UN6
    • [修复] Controller 派生类如果贴了 [Route] 特性后出现在 Swagger 中 bug #I27TN7
    • [修复] SqlScalar 执行 sql 返回 Nullable 类型出现转换失败 bug #I27S2N
    • [修复] [UnitOfWork] 特性异常 bug #I27MLM
    • [修复] sql 静态执行方式和 sql 高级代理无法监听数据库连接状态 bug #I27M4F
    • [修复] 修复更换 Json 序列化库无效 bug,如替换为 Microsoft.AspNetCore.Mvc.NewtonsoftJson #I27M43
    • [修复] Furion Tools 工具生成模型 bug #I27XI5
    • [修复] 软删除没有生效 bug #I2804I
    • [修复] Furion Tools 识别带多个 \\ 的连接字符串识别 bug #I280TS#PR91
    • [修复] Furion Tools 无法取消生成 bug #I2816M
    • [修复] DateTimeOffset 转本地时间差 8 小时 bug #I28BA9
    • [修复] 启用 bundle js&css 压缩后启动异常 bug #I28KR
    • [修复] ValidationTypes.Required 无效 bug #PR98
    • [修复] 规范化结果OnValidateFailed 参数名拼写错误 bug #PR93#PR92
    • [修复] 授权管道验证失败还显示结果 bug #PR89
  • 其他更改

    • [更新] README.md 友情连接地址 #PR88
    • [更新] 模板脚手架源码,添加 EFCore Tools#PR87
    • [更新] README.md Nuget 图标 #PR85
    • [废弃] 将 List<T>DateTable #PR97
  • 文档变化

    • [新增] 视图引擎模板文档 #I27ZVA
    • [新增] EFCore 时态查询文档 #I28AJ, DOC
    • [更新] 仓储文档书写纰漏 bug #PR90
    • [更新] 选项文档错误 bug #PR86
    • [更新] 实体数据监听器 文档书写错误 bug #PR83
    • [更新] 数据库上下文、多数据库、脚手架等文档
  • 问答答疑

    • [建议] 希望 api 返回的值自动将 null 转为 '' 或 [][#I286IJ](https://gitee.com/dotnetchina/Furion/issues/I286IJ),【已关闭】
    • [建议] 添加网关功能 #I27TP7,【已关闭】
    • [建议] 新增 SqlQuery<T> 获取单条记录方法 #I28M1V,【已关闭】
    • [建议] 希望可以提供集成 Serilog 例子 #I282J4,【已关闭】
    • [疑问] 如何通过特性配置唯一约束 #I2891L,【已关闭】
    • [疑问] 怎么读取 appsettings.json 数组 #I27WU,【已关闭】
    • [疑问] IRepository<TEntity> 出现空异常 #I281IE,【已关闭】
    • [疑问] 规范化接口问题问题 #I28NMZ,【已关闭】
    • [疑问] 统一返回值模型中 OnResponseStatusCodes 未执行 #I28NNL,【已关闭】

v1.2.0(已发布)#

  • 新特性

    • [新增] 雪花算法 #I26OXG, #PR78
    • [新增] [AppDbContext] 配置数据库提供器支持 #I27G3T
    • [新增] 实体表数据更改监听接口 IEntityDataChangedListener #I278DD, #I278LQ
    • [新增] 全局服务接口 AOP 拦截功能 #I278CP
    • [新增] 定位器仓储 IDbRepository<TDbContextLocator> #I276Q3
    • [新增] 数据库操作 InsertOrUpdate 支持排除空字符串功能 #I272OG
    • [新增] 数据库操作 UpdateIncludeUpdateExclude 匿名对象支持 #I271X0
    • [新增] 数据验证传入空对象跳过验证支持 #I273R4
    • [新增] 应用启动时支持排除特定配置文件自动加载 #I26U0A
    • [新增] 单个实体表名前缀支持 #I26LX0
    • [新增] MySql 数据库自动配置默认版本号 #I26XQ6
    • [优化] 授权处理程序代码
  • 突破性变化

    • [新增] 实体表数据更改监听接口 IEntityDataChangedListener #I278DD, #I278LQ
    • [新增] 全局服务接口 AOP 拦截功能 #I278CP
    • [新增] 雪花算法 #I26OXG, #PR78
  • 问题修复

    • [修复] 视图引擎加载外部程序集出错 bug
    • [修复] 依赖注入代理接口报空对象异常 bug
    • [修复] EFCore 取消附加实体出错 bug
    • [修复] 数据库仓储在非 Web 请求下出现空异常 bug
    • [修复] 多个授权策略共存问题出现无效 bug
    • [修复] 友好异常 Oop.Oh 不支持普通方法 bug
    • [修复] 获取多租户对象时数据库上下文出现作用域验证失败 bug
    • [修复] 工作单元不支持 Sql代理 拦截 bug #I27GST
  • 其他更改

  • 文档变化


v1.1.0(已发布)#

  • 新特性

    • [新增] Db.GetDbContext() 获取默认数据库上下文方法
    • [新增] HttpContextUtility.GetCurrentHttpContext() 获取全局 HttpContext 上下文
    • [新增] App.GetRequiredService<> 解析服务方法
    • [新增] object.GetService<> 对象拓展方法
    • [新增] 策略授权 PolicyPipeline 基类方法,支持多重判断授权
    • [新增] JWTEncryption.ValidateJwtBearerToken 手动验证静态方法
    • [新增] 全局数据库上下文 InsertOrUpdateIgnoreNullValuesEnabledEntityStateTracked 全局配置
    • [新增] Swagger Jwt授权 全局授权参数 #I26GLR
    • [新增] InsertOrUpdate 支持自定义判断条件功能 #I269Q1
    • [新增] 字符串字段小写命名支持 #I2695D
    • [新增] 字符串文本对比功能 #I268LE
    • [新增] 全局异常特性消息功能 #I2662O
    • [新增] InsertUpdate 数据库忽略空值功能 #I264Q4
  • 突破性变化

    • [调整] Fur 项目名为 Furion
    • [调整] Db.GetRequestDbContext<>() 命名为 Db.GetDbContext<>()
    • [调整] Db.GetDbContext<>() 命名为 Db.GetDuplicateDbContext<>()
    • [重构] App.GetService<> 解析服务的底层逻辑,大大提高了解析服务的性能
    • [重构] 授权核心代码,保持和微软一致的授权规范 #I26DCB
    • [移除] App.GetRequestService<> 方法
    • [移除] ValidateJwtBearer Jwt 授权方法,无需手动判断了
  • 问题修复

    • [修复] Furion 官方脚手架生成后编译异常 bug
    • [修复] Tenant 内置属性不是 virtual 修饰 bug
    • [修复] dockerfile 新命名构建失败 bug
    • [修复] 自定义角色授权和多个授权共存出现 403 bug #I26H1L
    • [修复] httpContext.GetEndpoint() 空异常 bug #PR73
    • [修复] Oops.Oh 空异常和不支持服务服务抛异常 bug #I26EFU#I26GM4
    • [修复] cli.ps 生成文件编码乱码 bug #I26DVT
    • [修复] Swagger 文件上传按钮不显示 #I26B6U
    • [修复] 规范化结果授权状态码序列化大小写不一致问题 #I26B26
    • [修复] 未启用规范化结果时中文乱码 bug #I268T5
    • [修复] MySql 异步异常捕获不到 bug #I265SO
    • [修复] cli.ps1 提示找不到数据库连接字符串 bug #I2647U
  • 其他更改

  • 文档变化

    • [更新] 一分钟入门、安全鉴权、数据库等文档

v1.0.3(已发布)#

  • 新特性

    • [新增] Mvc 模板脚手架:Fur.Template.Mvc
    • [新增] WebApi 模板:Fur.Template.Api
    • [新增] Mvc/WebApi 模板:Fur.Template.App
    • [新增] Razar Pages 模板:Fur.Template.Razor
    • [新增] Blazor 模板:Fur.Template.Blazor
  • 突破性变化

    • [调整] PagedListSystem.Collections.Generic 命名空间下
    • [优化] 解析服务性能问题,底层代码大量优化
  • 问题修复

    • [修复] ApiSears.ControllerEnd不起作用 bug #I25KH6
    • [修复] RemoteRequest 请求完成结果序列化属性大小写问题 #I25I8R
    • [修复] HttpContext.GetEndpoinet() 空异常 bug #PR73
  • 其他更改

  • 文档变化

    • [更新] 入门文档、数据库上下文文档、多数据库操作文档

v1.0.2(已发布)#

  • 新特性

    • [新增] Pomelo.EntityFrameworkCore.MySql 最新 .NET 5 包配置 #I24ZQK
    • [新增] .AddDateTimeJsonConverter(format) 时间格式序列化配置
    • [新增] DateTimeDateTimeOffset 类型序列化格式配置 #I253FI
  • 突破性变化

    • [更新] Mapster 包至 7.0.0
    • [调整] App.Services 名为 App.ServiceProvider
    • [移除] App.ApplicationServicesApp.GetRequestService<>()
    • [移除] 非 Web 主机注入拓展
  • 问题修复

    • [修复] services.AddFriendlyException() 缺少配置注入 bug
    • [修复] 数据库上下文池被释放和高并发下内存溢出 bug #I2524K#I24UMN
    • [修复] Sql代理 返回空数据时异常 bug #I24TCK
    • [修复] 工作单元 [UnitOfWork] 多数据库被释放 bug #I24Q6W
  • 其他更改

    • [调整] EntityBaseEntity 所有属性为 vitural 修饰
    • [优化] Jwt 读取和解析性能
    • [优化] 优化代码支持 C# 9.0 最新语法
    • [优化] MD5 加密性能 #PR71
    • [移除] 无用或未使用代码
  • 文档

    • [更新] 数据库上下文、多数据库、一分钟入门文档

v1.0.0(已发布)#

  • 新特性

    • [新增] 网络请求 RemoteRequest 组件 #I1YYWD
    • [新增] .AddInjectBase() 注入,只包含基础服务注入
    • [新增] 所有服务都支持 IServiceCollectionIMvcBuilder 注入
    • [新增] 抛异常状态码设置功能 StatusCode
    • [新增] Swagger 序列化支持 Pascal 属性命名方式
  • 突破性变化

    • [更新] 所有的包为 .NET 5 正式版
  • 问题修复

    • [修复] SqlProxy 代理异步处理 bug
    • [修复] 数据库类型 DatetimeDateTimeOffset bug
    • [修复] 属性首字母大小写序列化不匹配出现 null bug
    • [修复] 对象序列化中文出现乱码 bug
    • [修复] 默认序列化配置无效 bug
    • [修复] 数据库非依赖注入方式提交无效 bug
    • [修复] 应用程序池提交所有 DbContext 空异常 bug
    • [修复] Saas 多租户 Tenant 类型字符串属性在 MySql 数据库下出现 longtext 类型 bug
    • [修复] Mvc 自动验证字符串空值 bug #I24M2T
    • [修复] 枚举注释被覆盖 bug #I24N6J
    • [修复] 忽略规范化结果无效 bug #I24B8P
    • [修复] Swagger 默认 ContentType 不是 applicaiton/json bug #I24F3U
    • [修复] 内置 System.Text.JsonNewtonsoft.Json 冲突 bug #I24F3U
  • 其他更改

    • [调整] Fur 框架域名为:https://furion.pro
    • [调整] 仓储 FromSqlRawFromSqlInterpolated 接口位置
    • [优化] 数据加解密性能,#PR70
  • 文档

    • [更新] README.md、框架介绍、数据库上下文、配置选项、多租户、跨域文档
Last updated on by Monk
- + @@ -30,6 +30,6 @@ - + \ No newline at end of file diff --git a/docs/docs/view-engine/index.html b/docs/docs/view-engine/index.html index e48f01546c1..d80549429c7 100644 --- a/docs/docs/view-engine/index.html +++ b/docs/docs/view-engine/index.html @@ -8,7 +8,7 @@ 17. 视图引擎 | Furion - + @@ -27,7 +27,7 @@
var template = _viewEngine.Compile<CustomModel>(content);
var result = template.Run(instance =>
{
instance.A = 10;
instance.B = "Alex";
});

结果:

Hello 10, Alex, -=123=-

17.5 IViewEngine 接口#

IViewEngine 提供了简单方便的 RunCompile 方法,也提供了最原始化的 CompileRun 方法。

通过原始的 CompileRun 方法可以实现很多复杂的逻辑和自定义指令集。

/// <summary>
/// 编译模板
/// </summary>
/// <param name="content"></param>
/// <param name="builderAction"></param>
/// <returns></returns>
IViewEngineTemplate Compile(string content, Action<IViewEngineOptionsBuilder> builderAction = null);
/// <summary>
/// 编译模板
/// </summary>
/// <param name="content"></param>
/// <param name="builderAction"></param>
/// <returns></returns>
Task<IViewEngineTemplate> CompileAsync(string content, Action<IViewEngineOptionsBuilder> builderAction = null);
/// <summary>
/// 编译模板
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="content"></param>
/// <param name="builderAction"></param>
/// <returns></returns>
IViewEngineTemplate<T> Compile<T>(string content, Action<IViewEngineOptionsBuilder> builderAction = null)
where T : IViewEngineModel;
/// <summary>
/// 编译模板
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="content"></param>
/// <param name="builderAction"></param>
/// <returns></returns>
Task<IViewEngineTemplate<T>> CompileAsync<T>(string content, Action<IViewEngineOptionsBuilder> builderAction = null)
where T : IViewEngineModel;

17.6 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by Monk
- + diff --git a/docs/docs/virtual-deploy/index.html b/docs/docs/virtual-deploy/index.html index 279271e8f42..da2e3bc832f 100644 --- a/docs/docs/virtual-deploy/index.html +++ b/docs/docs/virtual-deploy/index.html @@ -8,7 +8,7 @@ 28.4 二级虚拟目录部署 | Furion - + @@ -22,7 +22,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

28.4 二级虚拟目录部署

28.4.1 关于二级虚拟目录#

通常我们的站点都是部署在网站的根目录下的,但是有些时候,我们可能将网站根目录下的目录作为二级站点或子站点,这个时候,就会出现 404 错误了。

这个时候就需要进行一些特殊配置了。

28.4.1.2 配置 Startup.cs#

首先,我们需要配置 Startup.cs 中的 Configure,如:

public void Configure(IApplicationBuilder application, IWebHostEnvironment env)
{
application.Map("/二级目录", app=>
{
// 其他中间件代码全部在这里面写
});
}

28.4.1.3 启用 Swagger 虚拟目录支持#

第二步,在 appsettings.json 配置文件(其他配置文件也可以)中添加以下配置:

{
"SpecificationDocumentSettings": {
"VirtualPath": "/二级目录"
}
}

28.4.2 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by Monk
- + diff --git a/docs/index.html b/docs/index.html index da867163079..75eff1eacbf 100644 --- a/docs/index.html +++ b/docs/index.html @@ -8,7 +8,7 @@ 让 .NET 开发更简单,更通用,更流行。 Furion | Furion - + @@ -26,7 +26,7 @@
[IfException(1000, "用户ID: {0} 不存在")]
public async Task<UserDto> GetUser([Range(1, int.MaxValue)] int userId)
{
var user = await _userRepository.FindOrDefaultAsync(userId);
_ = user ?? throw Oops.Oh(1000, userId);
return user.Adapt<UserDto>();
}
public async Task<RemoteData> GetRemote(string id)
{
var data = await $"https://www.furion.pro/data?id={id}".GetAsAsync<RemoteData>();
return data;
}
}

完全开源免费

代码托管在开源中国 Gitee

3750
Stars
1100
Forks
128,327
Downloads

功能模块

麻雀虽小五脏俱全

大量使用者测评

来听听他们是怎么说的

理想和现实

作者的技术是我接触.NET程序员中最好的一个,代码的质量,文档的质量都是一等一的。

kesshei

强烈支持,因为有你们,.net 会走的更远。

逆天的蝈蝈

非常优秀的开源作品,点赞支持

张芸溪

大概看了一下,觉得项目非常棒。core生态一定能火

赖皮小鳄鱼

作者好棒,支持国内.net!

gudufy

做得非常棒,打算基于你的框架做一个基本的后台管理出来,供大家快速开发中小型项目。

ThinkCoder

文档写的真不错,代码质量也非常高,注释非常完善,赞一个。

liuina

期待文档写完的那一天,绝对惊艳四座。

weiyu.xiao

很不错的项目,对快速搭建健壮的技术架构,帮助业务成功很有帮助。

我们的客户

我们的软件包已在全球多个项目中使用。从小型企业到企业的解决方案及知名企业。公司在简单软件和复杂管理系统的开发方面都信任我们。

立即添加您的公司
- + diff --git a/docs/search/index.html b/docs/search/index.html index 47ca81a5dfd..d7ebd7f0ee2 100644 --- a/docs/search/index.html +++ b/docs/search/index.html @@ -8,7 +8,7 @@ Search the documentation | Furion - + @@ -25,7 +25,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

Search the documentation

- + diff --git a/handbook/build/404.html b/handbook/build/404.html index 9ebd07cbfee..1b37a9354f2 100644 --- a/handbook/build/404.html +++ b/handbook/build/404.html @@ -8,14 +8,14 @@ Page Not Found | Furion - +
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

Page Not Found

We could not find what you were looking for.

Please contact the owner of the site that linked you to the original URL and let them know their link is broken.

- + \ No newline at end of file diff --git a/handbook/build/assets/js/1c2c7d62.ac9866e8.js b/handbook/build/assets/js/1c2c7d62.dbf90fc1.js similarity index 61% rename from handbook/build/assets/js/1c2c7d62.ac9866e8.js rename to handbook/build/assets/js/1c2c7d62.dbf90fc1.js index 283c4652177..f2cd69d6f7e 100644 --- a/handbook/build/assets/js/1c2c7d62.ac9866e8.js +++ b/handbook/build/assets/js/1c2c7d62.dbf90fc1.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[18],{205:function(e,n,r){"use strict";r.d(n,"a",(function(){return u})),r.d(n,"b",(function(){return f}));var t=r(0),o=r.n(t);function i(e,n,r){return n in e?Object.defineProperty(e,n,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[n]=r,e}function a(e,n){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(e);n&&(t=t.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),r.push.apply(r,t)}return r}function s(e){for(var n=1;n=0||(o[r]=e[r]);return o}(e,n);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(t=0;t=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var c=o.a.createContext({}),l=function(e){var n=o.a.useContext(c),r=n;return e&&(r="function"==typeof e?e(n):s(s({},n),e)),r},u=function(e){var n=l(e.components);return o.a.createElement(c.Provider,{value:n},e.children)},d={inlineCode:"code",wrapper:function(e){var n=e.children;return o.a.createElement(o.a.Fragment,{},n)}},b=o.a.forwardRef((function(e,n){var r=e.components,t=e.mdxType,i=e.originalType,a=e.parentName,c=p(e,["components","mdxType","originalType","parentName"]),u=l(r),b=t,f=u["".concat(a,".").concat(b)]||u[b]||d[b]||i;return r?o.a.createElement(f,s(s({ref:n},c),{},{components:r})):o.a.createElement(f,s({ref:n},c))}));function f(e,n){var r=arguments,t=n&&n.mdxType;if("string"==typeof e||t){var i=r.length,a=new Array(i);a[0]=b;var s={};for(var p in n)hasOwnProperty.call(n,p)&&(s[p]=n[p]);s.originalType=e,s.mdxType="string"==typeof e?e:t,a[1]=s;for(var c=2;c(u => u.Id == 1);\nvar expression2 = LinqExpression.Create((u,i) => u.Id ==1 && i > 0);\n")),Object(i.b)("h2",{id:"52-\u62fc\u63a5\u4e24\u4e2a\u8868\u8fbe\u5f0f"},"5.2 \u62fc\u63a5\u4e24\u4e2a\u8868\u8fbe\u5f0f"),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre",className:"language-cs"},"var expression = LinqExpression.And(expression1, expression2);\nvar expression2 = LinqExpression.IndexAnd(expression1, expression2);\nvar expression3 = LinqExpression.Or(expression2, expression3);\nvar expression4 = LinqExpression.IndexOr(expression2, expression3);\n")))}l.isMDXComponent=!0}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[18],{205:function(e,n,r){"use strict";r.d(n,"a",(function(){return u})),r.d(n,"b",(function(){return f}));var t=r(0),o=r.n(t);function i(e,n,r){return n in e?Object.defineProperty(e,n,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[n]=r,e}function a(e,n){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(e);n&&(t=t.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),r.push.apply(r,t)}return r}function s(e){for(var n=1;n=0||(o[r]=e[r]);return o}(e,n);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(t=0;t=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var c=o.a.createContext({}),l=function(e){var n=o.a.useContext(c),r=n;return e&&(r="function"==typeof e?e(n):s(s({},n),e)),r},u=function(e){var n=l(e.components);return o.a.createElement(c.Provider,{value:n},e.children)},d={inlineCode:"code",wrapper:function(e){var n=e.children;return o.a.createElement(o.a.Fragment,{},n)}},b=o.a.forwardRef((function(e,n){var r=e.components,t=e.mdxType,i=e.originalType,a=e.parentName,c=p(e,["components","mdxType","originalType","parentName"]),u=l(r),b=t,f=u["".concat(a,".").concat(b)]||u[b]||d[b]||i;return r?o.a.createElement(f,s(s({ref:n},c),{},{components:r})):o.a.createElement(f,s({ref:n},c))}));function f(e,n){var r=arguments,t=n&&n.mdxType;if("string"==typeof e||t){var i=r.length,a=new Array(i);a[0]=b;var s={};for(var p in n)hasOwnProperty.call(n,p)&&(s[p]=n[p]);s.originalType=e,s.mdxType="string"==typeof e?e:t,a[1]=s;for(var c=2;c(u => u.Id == 1);\nvar expression2 = LinqExpression.Create((u,i) => u.Id == 1 && i > 0);\n")),Object(i.b)("h2",{id:"52-\u62fc\u63a5\u4e24\u4e2a\u8868\u8fbe\u5f0f"},"5.2 \u62fc\u63a5\u4e24\u4e2a\u8868\u8fbe\u5f0f"),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre",className:"language-cs"},"// \u521b\u5efa\u4e00\u4e2a\u521d\u59cb\u5316\u7684\u8868\u8fbe\u5f0f\nvar expression = LinqExpression.And();\nvar expression2 = LinqExpression.IndexAnd();\nvar expression3 = LinqExpression.Or();\nvar expression4 = LinqExpression.IndexOr();\n\n// \u62fc\u63a5\u8868\u8fbe\u5f0f\nvar expression5 = expression.Add(expression2);\nvar expression6 = expression.AddIf(age > 18, expression2);\nvar expression7 = expression.Or(expression2);\nvar expression8 = expression.OrIf(age > 18, expression2);\n\n// \u83b7\u53d6\u8868\u8fbe\u5f0f\u5c5e\u6027\u540d\nvar properyName = expression.GetExpressionPropertyName(u => u.Name); // Name\n")))}l.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/handbook/build/assets/js/4c79e569.471fbabe.js b/handbook/build/assets/js/4c79e569.471fbabe.js deleted file mode 100644 index 34fd7136192..00000000000 --- a/handbook/build/assets/js/4c79e569.471fbabe.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[35],{112:function(e,t,a){"use strict";a.r(t),a.d(t,"frontMatter",(function(){return r})),a.d(t,"metadata",(function(){return l})),a.d(t,"toc",(function(){return c})),a.d(t,"default",(function(){return o}));var i=a(3),n=a(7),b=(a(0),a(205)),r=(a(10),{id:"upgrade",title:"1.6 \u66f4\u65b0\u65e5\u5fd7",sidebar_label:"1.6 \u66f4\u65b0\u65e5\u5fd7"}),l={unversionedId:"upgrade",id:"upgrade",isDocsHomePage:!1,title:"1.6 \u66f4\u65b0\u65e5\u5fd7",description:"\u6b64\u7ae0\u8282\u53ea\u8bb0\u5f55\u91cd\u5927\u7248\u672c\u66f4\u65b0\u65e5\u5fd7\uff0c\u5c0f\u8fed\u4ee3\u7248\u672c\u4e0d\u505a\u66f4\u65b0\u3002\u60f3\u4e86\u89e3\u66f4\u591a\u66f4\u65b0\u5185\u5bb9\uff0c\u53ef\u67e5\u9605 CHANGELOG.md",source:"@site/docs/upgrade.mdx",slug:"/upgrade",permalink:"/furion/docs/upgrade",editUrl:"https://gitee.com/dotnetchina/Furion/tree/master/handbook/docs/upgrade.mdx",version:"current",lastUpdatedBy:"Monk",lastUpdatedAt:1616487095,formattedLastUpdatedAt:"3/23/2021",sidebar_label:"1.6 \u66f4\u65b0\u65e5\u5fd7",sidebar:"docs",previous:{title:"1.5 \u8d5e\u52a9 Furion",permalink:"/furion/docs/donate"},next:{title:"2.1 \u4e00\u5206\u949f\u4e0a\u624b",permalink:"/furion/docs/get-start"}},c=[{value:"v1.16.0 \uff08\u5f53\u524d\u7248\u672c\uff09",id:"v1160-\uff08\u5f53\u524d\u7248\u672c\uff09",children:[]},{value:"v1.15.0 \uff08\u5df2\u53d1\u5e03\uff09",id:"v1150-\uff08\u5df2\u53d1\u5e03\uff09",children:[]},{value:"v1.14.0\uff08\u5df2\u53d1\u5e03\uff09",id:"v1140\uff08\u5df2\u53d1\u5e03\uff09",children:[]},{value:"v1.13.0\uff08\u5df2\u53d1\u5e03\uff09",id:"v1130\uff08\u5df2\u53d1\u5e03\uff09",children:[]},{value:"v1.7.0\uff08\u5df2\u53d1\u5e03\uff09",id:"v170\uff08\u5df2\u53d1\u5e03\uff09",children:[]},{value:"v1.4.0\uff08\u5df2\u53d1\u5e03\uff09",id:"v140\uff08\u5df2\u53d1\u5e03\uff09",children:[]},{value:"v1.2.0\uff08\u5df2\u53d1\u5e03\uff09",id:"v120\uff08\u5df2\u53d1\u5e03\uff09",children:[]},{value:"v1.1.0\uff08\u5df2\u53d1\u5e03\uff09",id:"v110\uff08\u5df2\u53d1\u5e03\uff09",children:[]},{value:"v1.0.3\uff08\u5df2\u53d1\u5e03\uff09",id:"v103\uff08\u5df2\u53d1\u5e03\uff09",children:[]},{value:"v1.0.2\uff08\u5df2\u53d1\u5e03\uff09",id:"v102\uff08\u5df2\u53d1\u5e03\uff09",children:[]},{value:"v1.0.0\uff08\u5df2\u53d1\u5e03\uff09",id:"v100\uff08\u5df2\u53d1\u5e03\uff09",children:[]}],p={toc:c};function o(e){var t=e.components,a=Object(n.a)(e,["components"]);return Object(b.b)("wrapper",Object(i.a)({},p,a,{components:t,mdxType:"MDXLayout"}),Object(b.b)("p",null,Object(b.b)("strong",{parentName:"p"},"\u6b64\u7ae0\u8282\u53ea\u8bb0\u5f55\u91cd\u5927\u7248\u672c\u66f4\u65b0\u65e5\u5fd7\uff0c\u5c0f\u8fed\u4ee3\u7248\u672c\u4e0d\u505a\u66f4\u65b0\u3002"),"\u60f3\u4e86\u89e3\u66f4\u591a\u66f4\u65b0\u5185\u5bb9\uff0c\u53ef\u67e5\u9605 ",Object(b.b)("a",{parentName:"p",href:"https://gitee.com/dotnetchina/Furion/blob/master/CHANGELOG.md"},"CHANGELOG.md")),Object(b.b)("h2",{id:"v1160-\uff08\u5f53\u524d\u7248\u672c\uff09"},"v1.16.0 \uff08\u5f53\u524d\u7248\u672c\uff09"),Object(b.b)("ul",null,Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u65b0\u7279\u6027")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"IDGenerator")," \u96ea\u82b1 ID \u7b97\u6cd5\uff0c\u611f\u8c22 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/yitter/idgenerator"},"idgenerator")," \u4f5c\u8005\u63d0\u4ea4 PR ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/pulls/204"},"#PR204")," ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I3B60S"},"#I3B60S")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"DbContext")," \u5237\u65b0\u591a\u79df\u6237\u7f13\u5b58\u62d3\u5c55\u65b9\u6cd5 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I39N5U"},"#I39N5U")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u81ea\u5b9a\u4e49\u914d\u7f6e\u5355\u4e2a\u63a7\u5236\u5668\u540d\u79f0\u89c4\u8303\uff0c\u5982\u5c0f\u5199\u8def\u7531 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I3A5XL"},"#I3A5XL")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u83b7\u53d6\u5f53\u524d\u9009\u62e9\u533a\u57df\u8bed\u8a00\u65b9\u6cd5 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I3BSDH"},"#I3BSDH")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u7a81\u7834\u6027\u53d8\u5316")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u5347\u7ea7]"," .NET 5 SDK \u81f3 5.0.4 \u7248\u672c ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I3ASTL"},"#I3ASTL")),Object(b.b)("li",{parentName:"ul"},"[\u91cd\u6784]"," \u8fdc\u7a0b\u8bf7\u6c42\u6240\u6709\u529f\u80fd ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2LB7M"},"#I2LB7M")),Object(b.b)("li",{parentName:"ul"},"[\u91cd\u6784]"," ",Object(b.b)("inlineCode",{parentName:"li"},"JSON")," \u5e8f\u5217\u5316\u529f\u80fd\uff0c\u63d0\u4f9b\u7edf\u4e00\u7684\u62bd\u8c61\u63a5\u53e3\uff0c\u65b9\u4fbf\u81ea\u7531\u66ff\u6362 ",Object(b.b)("inlineCode",{parentName:"li"},"JSON")," \u5e93 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I39GT9"},"#I39GT9")),Object(b.b)("li",{parentName:"ul"},"[\u91cd\u6784]"," \u9a8c\u8bc1\u5931\u8d25\u8fd4\u56de\u6d88\u606f\u6a21\u578b\u53ca\u89c4\u8303\u5316\u63a5\u53e3\u9a8c\u8bc1\u53c2\u6570 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I3AFQW"},"#I3AFQW")),Object(b.b)("li",{parentName:"ul"},"[\u4f18\u5316]"," \u63d2\u4ef6\u5f0f\u5f00\u53d1\u70ed\u63d2\u62d4\u529f\u80fd\uff0c\u5b9e\u73b0\u52a8\u6001\u52a0\u8f7d\u5378\u8f7d ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/pulls/200"},"#PR200"),", \u611f\u8c22 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/samwangcoder"},"@SamWangCoder")),Object(b.b)("li",{parentName:"ul"},"[\u79fb\u9664]"," \u79fb\u9664 ",Object(b.b)("inlineCode",{parentName:"li"},"JsonSerializerUtility")," \u9759\u6001\u7c7b\u53ca\u79fb\u9664\u5c5e\u6027\u5927\u5199\u5e8f\u5217\u5316\u62d3\u5c55\u914d\u7f6e ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I3AFRJ"},"#I3AFRJ")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u95ee\u9898\u4fee\u590d")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"MVC")," \u6a21\u5f0f\u4e0b\u4e0d\u652f\u6301\u9a8c\u8bc1\u81ea\u5b9a\u4e49\u9a8c\u8bc1\u903b\u8f91 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I39LM5"},"#I39LM5")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u9a8c\u8bc1\u6570\u503c\u7c7b\u578b\u6b63\u5219\u8868\u8fbe\u5f0f\u4e0d\u652f\u6301\u8d1f\u6570 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I39YUV"},"#I39YUV")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u6846\u67b6\u542f\u52a8\u65f6\u65e0\u6cd5\u52a0\u8f7d\u672a\u88ab\u5f15\u7528\u7684\u7a0b\u5e8f\u96c6 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I3A3Z4"},"#I3A3Z4")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"EFCoreRepository.IsAttached()")," \u65b9\u6cd5\u5224\u65ad\u9519\u8bef bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I3A824"},"#I3A824")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"\u52a8\u6001API")," \u9a7c\u5cf0\u663e\u793a\u914d\u7f6e\u65e0\u6548 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I3AF32"},"#I3AF32")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"cli.ps1")," \u4e0d\u652f\u6301\u65b0\u7248\u672c ",Object(b.b)("inlineCode",{parentName:"li"},"EFCore")," bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I3APO9"},"#I3APO9")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"EFCore")," \u5b9e\u4f53\u914d\u7f6e ",Object(b.b)("inlineCode",{parentName:"li"},"[Table]")," \u7279\u6027\u65e0\u6548 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I3BAYH"},"#I3BAYH")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u52a8\u6001 WebAPI ",Object(b.b)("inlineCode",{parentName:"li"},"CheckIsSplitCamelCase")," bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I3BLKX"},"#I3BLKX")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u4fee\u590d\u52a8\u6001 WebAPI \u914d\u7f6e\u4fdd\u7559 Action \u7684 Async \u540e\u7f00\u65e0\u6548\u95ee\u9898 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I3C3DA"},"#I3C3DA")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"JWT")," Token \u5237\u65b0\u540e\u65e7\u7684\u5237\u65b0 Token \u4f9d\u65e7\u53ef\u7528 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I3C8ZH"},"#I3C8ZH")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u591a\u8bed\u8a00 ",Object(b.b)("inlineCode",{parentName:"li"},"Razor")," \u89c6\u56fe\u53d8\u91cf\u591a\u8bed\u8a00\u4e71\u7801\u95ee\u9898 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I3CBMU"},"#I3CBMU")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u5176\u4ed6\u66f4\u6539")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u4f18\u5316]"," \u9ed8\u8ba4\u5e8f\u5217\u5316\u63d0\u4f9b\u5668 ",Object(b.b)("inlineCode",{parentName:"li"},"System.Text.Json")," \u53cd\u5e8f\u5217\u5316\u5b57\u7b26\u4e32\u65f6\u533a\u5206\u5927\u5c0f\u5199\u95ee\u9898 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I3BSXV"},"#I3BSXV")),Object(b.b)("li",{parentName:"ul"},"[\u4f18\u5316]"," \u4f18\u5316 ",Object(b.b)("inlineCode",{parentName:"li"},"MessageCenter")," \u6027\u80fd\u95ee\u9898 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I39PRR"},"#I39PRR")),Object(b.b)("li",{parentName:"ul"},"[\u4f18\u5316]"," \u6570\u636e\u5e93\u4e0a\u4e0b\u6587\u6c60\u5c0f\u6027\u80fd\u4f18\u5316"))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u6587\u6863\u53d8\u5316")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Docker")," \u73af\u5883\u4e0b\u81ea\u52a8\u5316\u90e8\u7f72 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/pulls/209"},"#PR209")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"JSON")," \u5e8f\u5217\u5316 \u6587\u6863 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I3B6D8"},"#I3B6D8")),Object(b.b)("li",{parentName:"ul"},"[\u66f4\u65b0]"," \u8de8\u57df\u3001\u5b89\u5168\u6388\u6743\u3001\u5373\u65f6\u901a\u4fe1\u6587\u6863\u3001\u591a\u8bed\u8a00\u3001\u89c4\u8303\u5316\u6587\u6863"))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u95ee\u7b54\u7b54\u7591")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Furion.Extras.DatabaseAccessor.SqlSugar")," \u914d\u7f6e\u591a\u4e2a\u6570\u636e\u5e93\u6253\u5370 SQL \u8bed\u53e5\u95ee\u9898 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I39PDC"},"#I39PDC")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(b.b)("inlineCode",{parentName:"li"},"ORACLE")," \u6570\u636e\u5e93\u591a\u79df\u6237\u6a21\u5f0f\u4e0b\u8fd4\u56de\u503c\u4e3a\u6307\u5b9a\u7c7b\u578b\u65f6\u7cfb\u7edf\u5361\u6b7b ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I39RNH"},"#I39RNH")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u5047\u5220\u9664\u6307\u5411\u5f02\u5e38 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I39XZA"},"#I39XZA")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Furion")," \u591a\u8bed\u8a00\u914d\u7f6e\u8282\u662f\u653e\u5728 ",Object(b.b)("inlineCode",{parentName:"li"},"AppSettings")," \u91cc\u9762\u8fd8\u662f\u5916\u9762\u5462\uff1f ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I3A4SB"},"#I3A4SB")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u6ca1\u627e\u5230\u6570\u636e\u5e93\u4e0a\u4e0b\u6587 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I3A5HS"},"#I3A5HS")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u6709 ",Object(b.b)("inlineCode",{parentName:"li"},"QQ")," \u4ea4\u6d41\u7fa4\u5417\uff1f ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I3AAM7"},"#I3AAM7")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Vue3")," \u73af\u5883\u4e0b\u914d\u7f6e ",Object(b.b)("inlineCode",{parentName:"li"},"SignalR")," \u8de8\u57df\u51fa\u9519 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I3ALQ7"},"#I3ALQ7")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u8bbe\u7f6e ",Object(b.b)("inlineCode",{parentName:"li"},"Swagger")," \u53c2\u6570\u975e\u5fc5\u586b ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I3AT02"},"#I3AT02")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," EFCore \u8c03\u7528 Insert \u65f6\u62a5 ",Object(b.b)("inlineCode",{parentName:"li"},"Unknown column 'Discriminator' in 'field list'")," \u5f02\u5e38 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I3B2LC"},"#I3B2LC")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u9006\u5411 ",Object(b.b)("inlineCode",{parentName:"li"},"mysql")," \u6570\u636e\u5e93\u65f6 ",Object(b.b)("inlineCode",{parentName:"li"},"cli")," \u51fa\u73b0\u9519\u8bef ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I3B64F"},"#I3B64F")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," Sql \u9ad8\u7ea7\u4ee3\u7406\u4f7f\u7528\u8fc7\u7a0b\u4e2d DateTime \u7c7b\u578b\u7684\u53c2\u6570\u5e8f\u5217\u5316\u5931\u8d25 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I3AZXK"},"#I3AZXK")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u4f7f\u7528 Mysql \u6267\u884c Add-Migration \u62a5\u9519 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I3B8EW"},"#I3B8EW")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," Saas \u591a\u79df\u6237\u6a21\u5f0f-\u72ec\u7acb Database \u6a21\u5f0f\u4e0b\u65e0\u6cd5\u83b7\u53d6 Tenant, \u5bfc\u81f4\u65e0\u6cd5\u81ea\u52a8\u5207\u6362\u7684\u95ee\u9898",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I3AVXU"},"#I3AVXU")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u5982\u4f55\u81ea\u5b9a\u4e49 WebAPI \u7edf\u4e00\u7ed3\u679c\u6a21\u578b ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I3BBYW"},"#I3BBYW")," ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I3BBYV"},"#I3BBYV")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u5728 ",Object(b.b)("inlineCode",{parentName:"li"},"Web.Entry")," \u9879\u76ee\u65b0\u5efa\u4e86\u4e00\u4e2a ",Object(b.b)("inlineCode",{parentName:"li"},"Controller"),"\uff0c\u591a\u4e86\u672a\u77e5\u65b9\u6cd5 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I3BKH5"},"#I3BKH5")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(b.b)("inlineCode",{parentName:"li"},"AOP")," \u62e6\u622a\u5982\u4f55\u89e3\u6790\u670d\u52a1 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I3BUM3"},"#I3BUM3")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u52a8\u6001 WebAPI \u8fd4\u56de\u53c2\u6570\u88ab\u7701\u7565 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I3C2XR"},"#I3C2XR")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u5982\u4f55\u8bbe\u7f6e\u67d0\u4e00\u4e2a\u63a5\u53e3\u54cd\u5e94\u6570\u636e\u4e0d\u81ea\u52a8\u8f6c\u5c0f\u5199\uff0c\u6309\u539f\u59cb\u5b57\u6bb5\u540d\u8fd4\u56de ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I38L9B"},"#I38L9B")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," code first \u5982\u4f55\u914d\u7f6e\u81ea\u52a8\u8fc1\u79fb ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I3CCR0"},"#I3CCR0")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," webapi \u6df7\u5408\u6388\u6743\u5982\u4f55\u533a\u5206\u4e0d\u540c\u7cfb\u7edf ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I3CJCY"},"#I3CJCY")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," EFCore \u4e0d\u652f\u6301\u9012\u5f52\u65e0\u9650\u7ea7\u904d\u5386\u5173\u7cfb ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I3CET9"},"#I3CET9")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u4e0d\u505a\u5b9e\u73b0")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u5efa\u8bae ",Object(b.b)("inlineCode",{parentName:"li"},"EFCore")," \u53ef\u914d\u7f6e\u5916\u952e\u5173\u7cfb\u5bfc\u822a\u95ee\u9898 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I3994X"},"#I3994X")),Object(b.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u5efa\u8bae\u5c06 ",Object(b.b)("inlineCode",{parentName:"li"},"EFCore")," \u5265\u79bb\u51fa\u6765\uff0c\u4f5c\u4e3a\u63d2\u4ef6\u7684\u5f62\u5f0f\u63d0\u4f9b\u3002\u8fd9\u6837\u53ef\u4ee5\u9009\u62e9\u81ea\u5df1\u559c\u6b22\u7684 ",Object(b.b)("inlineCode",{parentName:"li"},"ORM")," ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I3ABNX"},"#I3ABNX")),Object(b.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u4e8b\u4ef6\u603b\u7ebf\u80fd\u5426\u63d0\u4f9b\u8fd4\u56de\u503c ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I3AWL6"},"#I3AWL6")),Object(b.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," Sql \u6a21\u677f\u80fd\u4eff\u7167 Mybatis \u4e00\u6837\u52a0\u5404\u79cd\u6807\u7b7e\u5417\uff1f",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I3ASRS"},"#I3ASRS")),Object(b.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," EFCore \u66f4\u65b0\u6216\u6392\u9664\u66f4\u65b0\u6307\u5b9a\u5217\u652f\u6301\u4f20\u5165 DTO \u6a21\u578b ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I3AS5K"},"#I3AS5K")),Object(b.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u65b0\u589e ",Object(b.b)("inlineCode",{parentName:"li"},"UnitOfWork")," \u4e8b\u52a1\u5b8c\u6210\u4e8b\u4ef6 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I3BRMI"},"#I3BRMI"))))),Object(b.b)("hr",null),Object(b.b)("h2",{id:"v1150-\uff08\u5df2\u53d1\u5e03\uff09"},"v1.15.0 \uff08\u5df2\u53d1\u5e03\uff09"),Object(b.b)("ul",null,Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u65b0\u7279\u6027")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u8df3\u8fc7\u7279\u5b9a\u5b9e\u4f53\u6570\u636e\u5e93\u64cd\u4f5c\u76d1\u542c\u7279\u6027 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I386LB"},"#I386LB")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"IEntityChangedListener")," \u589e\u52a0\u5bf9 ",Object(b.b)("inlineCode",{parentName:"li"},"OldEntity")," \u7684\u652f\u6301 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I385X2"},"#I385X2")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u5b9e\u65f6\u901a\u4fe1\u81ea\u52a8\u914d\u7f6e\u96c6\u7ebf\u5668\u62d3\u5c55\u53ca\u7279\u6027 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I387QX"},"#I387QX")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Mapster")," \u62d3\u5c55\u652f\u6301 ",Object(b.b)("inlineCode",{parentName:"li"},"IMapper")," \u4f9d\u8d56\u6ce8\u5165\u65b9\u5f0f ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I38C7C"},"#I38C7C")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"[AppDbContext]")," \u7279\u6027\u9ed8\u8ba4\u6784\u9020\u51fd\u6570 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I38J97"},"#I38J97")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"UnifyContext.GetExceptionMetadata(context)")," \u8fd4\u56de\u9519\u8bef\u7801\u652f\u6301 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I38ONX"},"#I38ONX")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u7a81\u7834\u6027\u53d8\u5316"))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u95ee\u9898\u4fee\u590d")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u591a\u6b21\u5faa\u73af\u4e2d\u8c03\u7528 ",Object(b.b)("inlineCode",{parentName:"li"},"Db.GetNewDbContext()")," \u8fd8\u662f\u83b7\u53d6\u5230\u540c\u4e00\u4e2a\u5bf9\u8c61 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I38NNP"},"#I38NNP")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Swagger")," \u8fc7\u6ee4\u6389 ",Object(b.b)("inlineCode",{parentName:"li"},"object ")," \u7c7b\u578b\u5c5e\u6027\u95ee\u9898 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I38FHL"},"#I38FHL")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u540c\u4e00\u7c7b\u4e0d\u652f\u6301\u591a\u7ee7\u627f ",Object(b.b)("inlineCode",{parentName:"li"},"IEntityChangedListener")," \u95ee\u9898 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I38UQJ"},"#I38UQJ")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u81ea\u5b9a\u4e49\u5e8f\u5217\u5316\u5c5e\u6027\u540d\u79f0\u5bfc\u81f4\u9a8c\u8bc1\u5931\u8d25\u5c5e\u6027\u4e0d\u5339\u914d\u95ee\u9898 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I38W8Z"},"#I38W8Z")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u5176\u4ed6\u66f4\u6539")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u4f18\u5316]"," \u4ee3\u7801\u4e0d\u89c4\u8303\u547d\u540d\u5bfc\u81f4\u5f00\u53d1\u8005\u9605\u8bfb\u4ee3\u7801\u65f6\u4ea7\u751f\u6b67\u4e49"))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u6587\u6863\u53d8\u5316")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"FluentValidation")," \u96c6\u6210\u6587\u6863 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I38IOT"},"#I38IOT")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u95ee\u7b54\u7b54\u7591")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Furion")," \u6846\u67b6\u7248\u672c\u5411\u4e0b\u517c\u5bb9\u95ee\u9898 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I38WMZ"},"#I38WMZ")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u4e0d\u505a\u5b9e\u73b0")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u5efa\u8bae ",Object(b.b)("inlineCode",{parentName:"li"},"SqlSugar")," \u6dfb\u52a0\u52a8\u6001\u5207\u6362\u6570\u636e\u5e93\u529f\u80fd ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I38G4M"},"#I38G4M")),Object(b.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u5efa\u8bae ",Object(b.b)("inlineCode",{parentName:"li"},"MessageCenter")," \u91c7\u7528 ",Object(b.b)("inlineCode",{parentName:"li"},"Channel")," \u5b9e\u73b0 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I38BP8"},"#I38BP8")),Object(b.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u5efa\u8bae\u63a5\u53e3\u6587\u6863\u6574\u5408 Knife4jUI \u6216 Redoc ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I38S70"},"#I38S70"))))),Object(b.b)("hr",null),Object(b.b)("h2",{id:"v1140\uff08\u5df2\u53d1\u5e03\uff09"},"v1.14.0\uff08\u5df2\u53d1\u5e03\uff09"),Object(b.b)("ul",null,Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u65b0\u7279\u6027")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"EFCore")," 5.0 \u7684 ",Object(b.b)("inlineCode",{parentName:"li"},"Oracle")," \u6570\u636e\u5e93\u652f\u6301 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I37Z8E"},"#I37Z8E")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u63a7\u5236\u662f\u5426\u5728\u5f00\u53d1\u73af\u5883\u4e0b\u663e\u793a\u6570\u636e\u5e93\u8fde\u63a5\u4fe1\u606f ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I37YQ2"},"#I37YQ2")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"[NonUnify]")," \u652f\u6301\u5728\u7c7b\u4e2d\u8d34\u6b64\u7279\u6027 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I359Q6"},"#I359Q6")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"\u7f51\u7edc\u8bf7\u6c42")," \u5b57\u7b26\u4e32 ",Object(b.b)("inlineCode",{parentName:"li"},"HttpClient")," \u62e6\u622a\u5668 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I35F3E"},"#I35F3E")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"HttpContext")," \u53ca ",Object(b.b)("inlineCode",{parentName:"li"},"HttpRequest")," \u83b7\u53d6\u8fdc\u7a0b\u5730\u5740\u62d3\u5c55 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I3688Z"},"#I3688Z")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"services.AddMvcFilter<>")," \u6dfb\u52a0 ",Object(b.b)("inlineCode",{parentName:"li"},"Mvc")," \u8fc7\u6ee4\u5668\u62d3\u5c55 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I368BH"},"#I368BH")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u7a81\u7834\u6027\u53d8\u5316")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u5347\u7ea7]"," \u6846\u67b6\u4f9d\u8d56\u7684 .NET 5 SDK \u81f3\u6700\u65b0\u7248 5.0.3 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I37YQQ"},"#I37YQQ")),Object(b.b)("li",{parentName:"ul"},"[\u5347\u7ea7]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Swashbuckle.AspNetCore")," \u7ec4\u4ef6\u5305\u5230 ",Object(b.b)("inlineCode",{parentName:"li"},"6.0.x")," \u7248\u672c ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I37EZK"},"#I37EZK")),Object(b.b)("li",{parentName:"ul"},"[\u79fb\u9664]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Furion")," \u6846\u67b6 ",Object(b.b)("inlineCode",{parentName:"li"},"JWT")," \u62d3\u5c55\u7c7b\uff0c\u53ea\u5728 ",Object(b.b)("inlineCode",{parentName:"li"},"Furion.Extras.Authentication.JwtBearer")," \u4e2d\u4fdd\u7559 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I35D59"},"#I35D59")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u95ee\u9898\u4fee\u590d")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u4f20\u5165\u9519\u8bef ",Object(b.b)("inlineCode",{parentName:"li"},"JWT Token")," \u5b57\u7b26\u4e32\u5bfc\u81f4\u81ea\u52a8\u5237\u65b0 ",Object(b.b)("inlineCode",{parentName:"li"},"Token")," \u51fa\u73b0\u5b57\u7b26\u4e32\u8fb9\u754c\u503c\u5f02\u5e38 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I34ZE5"},"#I34ZE5")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u77ac\u65f6\u4f5c\u7528\u57df\u6570\u636e\u5e93\u4e0a\u4e0b\u6587\u4e5f\u4f1a\u81ea\u52a8\u52a0\u5165\u5de5\u4f5c\u5355\u5143\u5bfc\u81f4\u5199\u65e5\u5fd7\u65f6\u8fde\u9501\u5f02\u5e38 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I37WTV"},"#I37WTV")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u5176\u4ed6\u66f4\u6539")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u4f18\u5316]"," \u83b7\u53d6\u7cfb\u7edf\u73af\u5883\u53c2\u6570\u7684\u6027\u80fd ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I36SR5"},"#I36SR5")),Object(b.b)("li",{parentName:"ul"},"[\u4f18\u5316]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Furion")," \u5e95\u5c42\u6dfb\u52a0 ",Object(b.b)("inlineCode",{parentName:"li"},"Mvc")," \u8fc7\u6ee4\u5668\u4ee3\u7801 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I36SKA"},"#I36SKA")),Object(b.b)("li",{parentName:"ul"},"[\u4f18\u5316]"," \u6dfb\u52a0\u9ed8\u8ba4 ",Object(b.b)("inlineCode",{parentName:"li"},"Json")," \u5e8f\u5217\u5316\u65f6\u95f4\u9ed8\u8ba4\u65f6\u95f4\u683c\u5f0f ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I36SL0"},"#I36SL0")),Object(b.b)("li",{parentName:"ul"},"[\u5347\u7ea7]"," \u5347\u7ea7 ",Object(b.b)("inlineCode",{parentName:"li"},"SqlSugar")," \u62d3\u5c55\u5305\u5230 ",Object(b.b)("inlineCode",{parentName:"li"},"5.0.2.6")," \u7248\u672c ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I36SIG"},"#I36SIG")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u6587\u6863\u53d8\u5316")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u6570\u636e\u5e93\u5165\u95e8\u6587\u6863 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I37Z8S"},"#I37Z8S")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u66f4\u65b0\u65e5\u5fd7\u6587\u6863 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I36PI0"},"#I36PI0")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u8bf7\u6c42\u5ba1\u8ba1\u65e5\u5fd7\u3001\u6267\u884c ",Object(b.b)("inlineCode",{parentName:"li"},"Sql")," \u66f4\u65b0\u65e5\u5fd7\u6587\u6863 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I36PIK"},"#I36PIK")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u524d\u7aef\u4f7f\u7528 ",Object(b.b)("inlineCode",{parentName:"li"},"axios")," \u8de8\u57df\u914d\u7f6e\u6587\u6863 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I36PIT"},"#I36PIT")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"App")," \u9759\u6001\u7c7b\u83b7\u53d6\u5e94\u7528\u3001\u73af\u5883\u66f4\u591a\u4fe1\u606f\u6570\u636e ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I36SOV"},"#I36SOV")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u82f1\u6587\u7248 ",Object(b.b)("inlineCode",{parentName:"li"},"README.md")," \u4ecb\u7ecd ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I37QHP"},"#I37QHP")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u95ee\u7b54\u7b54\u7591"))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u4e0d\u505a\u5b9e\u73b0")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u591a\u8bed\u8a00\u8d44\u6e90\u6587\u4ef6\u81ea\u52a8\u521b\u5efa ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I35AA4"},"#I35AA4")),Object(b.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u5efa\u8bae\u591a\u8bed\u8a00\u52a0\u4e0a\u7ef4\u543e\u5c14\u8bed\u652f\u6301 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I37X1L"},"#I37X1L"))))),Object(b.b)("hr",null),Object(b.b)("h2",{id:"v1130\uff08\u5df2\u53d1\u5e03\uff09"},"v1.13.0\uff08\u5df2\u53d1\u5e03\uff09"),Object(b.b)("ul",null,Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u65b0\u7279\u6027")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u591a\u8bed\u8a00\u529f\u80fd\u53ca\u62d3\u5c55 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2DOCL"},"#I2DOCL")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u4e8b\u4ef6\u603b\u7ebf\u529f\u80fd\u53ca\u6d88\u606f\u4e2d\u5fc3 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I23BKN"},"#I23BKN")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Swagger")," \u5206\u7ec4\u663e\u793a\u9690\u85cf\u914d\u7f6e ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2AHH8"},"#I2AHH8")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Furion.Extras.Logging.Serilog")," \u62d3\u5c55\u63d2\u4ef6 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2AAN8"},"#I2AAN8")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"cli.ps")," \u652f\u6301 ",Object(b.b)("inlineCode",{parentName:"li"},"-Namespace")," \u547d\u540d\u7a7a\u95f4\u6307\u5b9a ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2A175"},"#I2A175")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Swagger")," \u89c4\u8303\u5316\u5316\u6587\u6863\u6388\u6743\u5931\u6548\u540e\u81ea\u52a8\u53d6\u6d88\u6388\u6743\u9501 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2AIWC"},"#I2AIWC")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Request.Body")," \u652f\u6301\u91cd\u590d\u8bfb\u529f\u80fd\uff0c\u4e3b\u8981\u89e3\u51b3\u5fae\u4fe1 SDK \u95ee\u9898 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2AMG0"},"#I2AMG0")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u7f51\u7edc\u8bf7\u6c42\u529f\u80fd\u53ca\u6587\u6863 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2APGJ"},"#I2APGJ")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"SqlSugar")," \u62d3\u5c55\u5305\u652f\u6301\u6253\u5370 ",Object(b.b)("inlineCode",{parentName:"li"},"sql")," \u5230 ",Object(b.b)("inlineCode",{parentName:"li"},"MiniProfiler")," \u4e2d ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2ASLS"},"#I2ASLS")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Furion.Extras.DatabaseAccesssor.Dapper")," \u62d3\u5c55\u63d2\u4ef6 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2ASYA"},"#I2ASYA")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Furion.Extras.DatabaseAccessor.PetaPoco")," \u62d3\u5c55\u63d2\u4ef6 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2AUGA"},"#I2AUGA")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u7f51\u7edc\u8bf7\u6c42\u5b57\u7b26\u4e32\u62d3\u5c55\u65b9\u6cd5 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2CPQ0"},"#I2CPQ0")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"SqlSugar")," \u62d3\u5c55\u65b0\u589e ",Object(b.b)("inlineCode",{parentName:"li"},"PagedList")," \u62d3\u5c55 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2CW99"},"#I2CW99")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u8fdc\u7a0b\u8bf7\u6c42\u652f\u6301\u53c2\u6570\u7279\u6027\u9a8c\u8bc1 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2CX5L"},"#I2CX5L")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"App.User")," \u83b7\u53d6\u5f53\u524d\u6388\u6743\u7528\u6237\u4fe1\u606f\u4fbf\u6377\u65b9\u6cd5 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2CZLO"},"#I2CZLO")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u89c4\u8303\u5316\u6587\u6863\u53ef\u914d\u7f6e\u529f\u80fd\uff0c\u652f\u6301 ",Object(b.b)("inlineCode",{parentName:"li"},"appsettings.json")," \u914d\u7f6e ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2D1K9"},"#I2D1K9")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u8fdc\u7a0b\u8bf7\u6c42\u62e6\u622a\u5668\u6dfb\u52a0\u65b9\u6cd5\u548c\u65b9\u6cd5\u53c2\u6570 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2D2CM"},"#I2D2CM")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u8fdc\u7a0b\u8bf7\u6c42\u51fa\u9519\u8fd4\u56de\u9ed8\u8ba4\u503c\u652f\u6301 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2D44M"},"#I2D44M")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u8fdc\u7a0b\u8bf7\u6c42 ",Object(b.b)("inlineCode",{parentName:"li"},"body")," \u53c2\u6570\u5e8f\u5217\u5316\u652f\u6301\u8bbe\u7f6e ",Object(b.b)("inlineCode",{parentName:"li"},"PropertyNamingPolicy")," ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2D685"},"#I2D685")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u8fdc\u7a0b\u670d\u52a1\u63a5\u53e3\u5ba2\u6237\u7aef\u914d\u7f6e ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2D7PS"},"#I2D7PS")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"AddInject")," \u548c ",Object(b.b)("inlineCode",{parentName:"li"},"UseInject")," \u5141\u8bb8\u81ea\u5b9a\u4e49 ",Object(b.b)("inlineCode",{parentName:"li"},"SecurityDefinitions")," \u548c ",Object(b.b)("inlineCode",{parentName:"li"},"SwaggerUI")," ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2DIMG"},"#I2DIMG")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"[SecurityDefine]")," \u9ed8\u8ba4\u6784\u9020\u51fd\u6570 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2DNXT"},"#I2DNXT")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"AspectDispatchProxy")," \u52a8\u6001\u4ee3\u7406\u7c7b ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2DO6I"},"#I2DO6I")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"[QueryParameters]")," \u7279\u6027\uff0c\u652f\u6301\u4e00\u952e\u5c06 ",Object(b.b)("inlineCode",{parentName:"li"},"Action")," \u53c2\u6570\u6dfb\u52a0 ",Object(b.b)("inlineCode",{parentName:"li"},"[FromQuery]")," \u7279\u6027 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2G8TF"},"#I2G8TF")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u52a8\u6001\u65e5\u5fd7\u914d\u7f6e\u53ca\u62d3\u5c55\u65b9\u6cd5 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2GDGD"},"#I2GDGD")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"WebApi")," \u8bf7\u6c42\u8c13\u8bcd\u9ed8\u8ba4\u89c4\u5219\u914d\u7f6e\u529f\u80fd ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2M70X"},"#I2M70X")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u7a81\u7834\u6027\u53d8\u5316")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u5347\u7ea7]"," ",Object(b.b)("inlineCode",{parentName:"li"},".NET 5")," SDK \u5230 ",Object(b.b)("inlineCode",{parentName:"li"},".NET 5.0.2")," \u7248\u672c ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2D0PZ"},"#I2D0PZ")),Object(b.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," \u6846\u67b6\u5185\u6240\u6709\u62d3\u5c55\u7c7b\u547d\u540d\u7a7a\u95f4\uff0c\u5168\u90e8\u8fc1\u79fb\u5230 ",Object(b.b)("inlineCode",{parentName:"li"},"Furion.\u6a21\u5757.Extensions")," \u4e0b ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2AH54"},"#I2AH54")),Object(b.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Swagger")," \u8bb0\u4f4f\u6388\u6743\u5b58\u50a8\u65b9\u5f0f\uff0c\u66ff\u6362 ",Object(b.b)("inlineCode",{parentName:"li"},"Session")," \u5b58\u50a8\u65b9\u5f0f\u4e3a ",Object(b.b)("inlineCode",{parentName:"li"},"LocalStorage")," \u65b9\u5f0f ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2AKUA"},"#I2AKUA")),Object(b.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Furion")," \u6846\u67b6\u5305\u63cf\u8ff0\u6587\u4ef6\uff0c\u51cf\u5c11\u6846\u67b6\u4f53\u79ef ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2APAU"},"#I2APAU")),Object(b.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," ",Object(b.b)("inlineCode",{parentName:"li"},"App.CanBeScanTypes")," \u4e3a ",Object(b.b)("inlineCode",{parentName:"li"},"App.EffectiveTypes")," ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2B0ZR"},"#I2B0ZR")),Object(b.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," ",Object(b.b)("inlineCode",{parentName:"li"},"App.ServiceProvider")," \u5c5e\u6027\u5e76\u79fb\u9664 ",Object(b.b)("inlineCode",{parentName:"li"},"App.GetDuplicateXXX")," \u65b9\u6cd5 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2CYZE"},"#I2CYZE")),Object(b.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Db.GetDuplicateDbContext")," \u4e3a ",Object(b.b)("inlineCode",{parentName:"li"},"Db.GetNewDbContext")," ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2CZ04"},"#I2CZ04")),Object(b.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Db.GetSqlDispatchProxy")," \u4e3a ",Object(b.b)("inlineCode",{parentName:"li"},"Db.GetSqlProxy")," ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2DO9T"},"#I2DO9T")),Object(b.b)("li",{parentName:"ul"},"[\u91cd\u6784]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Aop")," \u670d\u52a1\u62e6\u622a\u5668\uff0c\u652f\u6301\u5f02\u6b65\u3001\u540c\u6b65\u4e24\u79cd\u65b9\u5f0f ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2B9HQ"},"#I2B9HQ")),Object(b.b)("li",{parentName:"ul"},"[\u91cd\u6784]"," \u7f51\u7edc\u8bf7\u6c42\u6240\u6709\u529f\u80fd ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2BMR7"},"#I2BMR7")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u95ee\u9898\u4fee\u590d")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Swagger")," \u89c4\u8303\u5316\u5316\u7ed3\u679c\u4e0d\u4e00\u81f4 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2ACF3"},"#I2ACF3")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u6570\u636e\u5e93\u65b0\u589e\u6216\u66f4\u65b0\u5ffd\u7565\u7a7a\u503c\u64cd\u4f5c\u65b9\u6cd5\u62a5\u7a7a\u5f02\u5e38 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2AB6C"},"#I2AB6C")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Startup.cs")," Aop \u5168\u5c40\u62e6\u622a\u65e0\u6548 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2A7T2"},"#I2A7T2")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Token")," \u8fc7\u671f\u540e\u81ea\u52a8\u5237\u65b0 ",Object(b.b)("inlineCode",{parentName:"li"},"Token")," \u65e0\u6cd5\u83b7\u53d6\u6700\u65b0\u7684\u7528\u6237\u4fe1\u606f bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2AWQI"},"#I2AWQI")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},'[ApiDescriptionSettings(Tag="xx")]')," \u5bfc\u81f4 ",Object(b.b)("inlineCode",{parentName:"li"},"swagger.json")," \u62a5\u9519 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2B47R"},"#I2B47R")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Mysql")," sql \u6570\u636e\u5e93\u67e5\u8be2\u7ed3\u679c ",Object(b.b)("inlineCode",{parentName:"li"},"tinyint")," \u7c7b\u578b\u8f6c\u6362\u51fa\u9519 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2BEBM"},"#I2BEBM")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u89c4\u8303\u5316\u7ed3\u679c\u591a\u6b21\u5305\u88f9\u7c7b\u578b bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2BHHZ"},"#I2BHHZ")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u52a8\u6001 Api \u57fa\u5143\u7c7b\u578b\u6570\u7ec4\u95ee\u9898 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2BMS5"},"#I2BMS5")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"sql")," \u67e5\u8be2\u679a\u4e3e\u7c7b\u578b\u8f6c\u6362\u5f02\u5e38 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2BS2Y"},"#I2BS2Y")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"string.SqlQuerizeAsync()")," \u62d3\u5c55\u8fd4\u56de\u9519\u8bef bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2BSTS"},"#I2BSTS")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u52a8\u6001 Api \u5b50\u7c7b\u91cd\u5199\u7236\u7c7b\u65b9\u6cd5\u5e76\u53d6\u522b\u540d\u540e ",Object(b.b)("inlineCode",{parentName:"li"},"Swagger")," \u5f02\u5e38 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2C9VP"},"#I2C9VP")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u7f51\u7edc\u8bf7\u6c42 ",Object(b.b)("inlineCode",{parentName:"li"},"application/json")," \u5e8f\u5217\u5316\u5927\u5c0f\u5199\u95ee\u9898 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2CRJC"},"#I2CRJC")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u591a\u6570\u636e\u5e93\u5b9a\u4f4d\u5668\u5b9e\u4f53\u5d4c\u5957\u5173\u8054 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2CVN0"},"#I2CVN0")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u8de8\u57df\u54cd\u5e94\u5934\u8bbe\u7f6e\u65e0\u6548 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2CW5T"},"#I2CW5T")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u8fdc\u7a0b\u7f51\u7edc\u8bf7\u6c42\u4ee3\u7406\u6253\u5370\u5230 ",Object(b.b)("inlineCode",{parentName:"li"},"MiniProfiler")," bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2CZBC"},"#I2CZBC")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u8fdc\u7a0b\u8bf7\u6c42\u54cd\u5e94\u62e6\u622a\u5668 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2D4DG"},"#I2D4DG")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"SqlSugar")," \u6846\u67b6 ",Object(b.b)("inlineCode",{parentName:"li"},"AsQueryable()")," \u4e00\u76f4\u8ffd\u52a0\u53c2\u6570 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2DH1D"},"#I2DH1D")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u81ea\u52a8\u5237\u65b0 ",Object(b.b)("inlineCode",{parentName:"li"},"Token")," \u7a7a\u5f02\u5e38 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2DO29"},"#I2DO29")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u751f\u6210 ",Object(b.b)("inlineCode",{parentName:"li"},"JWT Token")," \u4e0d\u4f20\u8fc7\u671f\u65f6\u95f4\u51fa\u73b0\u9a8c\u8bc1 401 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2DO8L"},"#I2DO8L")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"AppStartup")," \u6392\u5e8f\u65e0\u6548 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2DVD2"},"#I2DVD2")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u672a\u542f\u7528\u591a\u8bed\u8a00\u670d\u52a1\u65f6\u53cb\u597d\u5f02\u5e38\u548c\u9a8c\u8bc1\u51fa\u73b0\u7a7a\u5f02\u5e38 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2ECUJ"},"#I2ECUJ")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u6570\u636e\u6821\u9a8c\u5b57\u6bcd\u548c\u6570\u5b57\u7ec4\u5408\u65e0\u6cd5\u5339\u914d bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2EF2Q"},"#I2EF2Q")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u6570\u636e\u6821\u9a8c\u624b\u673a\u6216\u56fa\u8bdd\u65e0\u6548 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2M5IZ"},"#I2M5IZ")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Dapper")," \u62d3\u5c55\u89e3\u6790 ",Object(b.b)("inlineCode",{parentName:"li"},"SqlConnection")," \u5f02\u5e38 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2M5P2"},"#I2M5P2")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u5f00\u542f\u591a\u8bed\u8a00\u540e\uff0c",Object(b.b)("inlineCode",{parentName:"li"},"EF")," \u8fc1\u79fb\u5f02\u5e38 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2M7DT"},"#I2M7DT")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"IEntityTypeBuilder")," \u4e0d\u652f\u6301\u591a\u91cd\u7ee7\u627f bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2PAOD"},"#I2PAOD")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"JwtHandler")," \u8bbe\u7f6e\u81ea\u52a8\u5237\u65b0\u540e\uff0c\u533f\u540d\u8bbf\u95ee\u65e0\u6cd5\u901a\u8fc7 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2SDOX"},"#I2SDOX")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Dapper")," \u62d3\u5c55\u4e2d ",Object(b.b)("inlineCode",{parentName:"li"},"SqlServer")," \u6570\u636e\u5e93\u83b7\u53d6\u8fde\u63a5\u5bf9\u8c61\u7c7b\u578b bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/pulls/159"},"#PR159")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u5176\u4ed6\u66f4\u6539")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u4f18\u5316]"," \u79fb\u9664 ",Object(b.b)("inlineCode",{parentName:"li"},"Sql")," \u67e5\u8be2\u7ed3\u679c\u6620\u5c04\u68c0\u67e5 ",Object(b.b)("inlineCode",{parentName:"li"},"[NotMapper]")," \u7279\u6027\u673a\u5236 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I34XD0"},"#I34XD0")),Object(b.b)("li",{parentName:"ul"},"[\u4f18\u5316]"," \u4f9d\u8d56\u6ce8\u5165\u65f6\u6392\u9664 ",Object(b.b)("inlineCode",{parentName:"li"},"IDynamicApiController")," \u63a5\u53e3 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2ECTG"},"#I2ECTG")),Object(b.b)("li",{parentName:"ul"},"[\u4f18\u5316]"," ",Object(b.b)("inlineCode",{parentName:"li"},"MD5")," \u52a0\u5bc6\u6027\u80fd ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/pulls/158"},"#PR158")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u6587\u6863\u53d8\u5316")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u91cd\u6784]"," \u6587\u6863\u9996\u9875 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I34XBR"},"#I34XBR")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u7f51\u7edc\u8bf7\u6c42\u6587\u6863 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2APGJ"},"#I2APGJ")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u591a\u8bed\u8a00\u6587\u6863 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2DOCL"},"#I2DOCL")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u6587\u6863\u5168\u6587\u641c\u7d22\u5f15\u64ce ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I34XAW"},"#I34XAW")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u5168\u5c40\u9759\u6001\u7c7b\u7c7b\u578b ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I34XB4"},"#I34XB4")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u6846\u67b6\u53ef\u914d\u7f6e\u9009\u9879\u6587\u6863 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I34XB9"},"#I34XB9")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u4e8b\u4ef6\u603b\u7ebf\u6587\u6863 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I34XBI"},"#I34XBI")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u6570\u636e\u52a0\u89e3\u5bc6\u6587\u6863 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I34XC0"},"#I34XC0")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u8d21\u732e\u6307\u5357\u6587\u6863 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I34XC8"},"#I34XC8")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"HttpContext")," \u53ca ",Object(b.b)("inlineCode",{parentName:"li"},"\u6587\u4ef6\u4e0a\u4f20\u4e0b\u8f7d")," \u535a\u5ba2\u6587\u7ae0 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I34XCB"},"#I34XCB")),Object(b.b)("li",{parentName:"ul"},"[\u5176\u4ed6]"," \u6587\u6863\u5c0f\u8c03\u6574\uff0c\u5c0f\u4f18\u5316"))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u95ee\u7b54\u7b54\u7591")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u8de8\u57df\u8bbe\u7f6e\u65e0\u6548 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2ASNJ"},"#I2ASNJ")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(b.b)("inlineCode",{parentName:"li"},"MVC")," \u89c6\u56fe\u65e0\u6548\uff0c\u539f\u56e0\u662f ",Object(b.b)("inlineCode",{parentName:"li"},".cshtml")," \u6587\u4ef6\u6ca1\u6709\u8bbe\u7f6e\u4e3a ",Object(b.b)("inlineCode",{parentName:"li"},"\u5185\u5bb9")," ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2AXUU"},"#I2AXUU")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Sql")," \u64cd\u4f5c\u53ef\u4ee5\u5b9e\u73b0\u4e8b\u52a1\u5417\uff1f",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2B0NX"},"#I2B0NX")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(b.b)("inlineCode",{parentName:"li"},"IRepository")," \u64cd\u4f5c\u6570\u636e\u5e93\u4f1a\u6253\u5f00\u591a\u6b21\u6570\u636e\u5e93\u8fde\u63a5 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2BB7B"},"#I2BB7B")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u5982\u4f55\u8fdb\u5165\u81ea\u5b9a\u4e49 ",Object(b.b)("inlineCode",{parentName:"li"},"AppAuthorizeHandler")," \u65ad\u70b9 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2BGXY"},"#I2BGXY")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(b.b)("inlineCode",{parentName:"li"},"SqlSugar")," \u6ce8\u5165\u95ee\u9898 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2C2AQ"},"#I2C2AQ")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u5efa\u8bae\u589e\u52a0 API \u7b7e\u540d\u9a8c\u8bc1\uff0c\u65f6\u6548\u9a8c\u8bc1 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2C6ET"},"#I2C6ET")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u591a\u6570\u636e\u5e93\u591a\u79df\u6237\u540c\u65f6\u4f7f\u7528 ",Object(b.b)("inlineCode",{parentName:"li"},"Add-Migration")," \u62a5\u9519 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2CEHS"},"#I2CEHS")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(b.b)("inlineCode",{parentName:"li"},"ISqlSugarRepository")," \u6ca1\u6709 ",Object(b.b)("inlineCode",{parentName:"li"},"Getxxx")," \u65b9\u6cd5 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2CJLZ"},"#I2CJLZ")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(b.b)("inlineCode",{parentName:"li"},"cli.ps1")," \u5982\u4f55\u5c06 ",Object(b.b)("inlineCode",{parentName:"li"},"sql")," \u91cc\u7684\u8868\u5bfc\u51fa\u6210 ",Object(b.b)("inlineCode",{parentName:"li"},"model")," \u7c7b ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2CSUL"},"#I2CSUL")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u624b\u52a8\u4fee\u6539 ",Object(b.b)("inlineCode",{parentName:"li"},"Swagger")," \u7ec8\u7ed3\u70b9\u8def\u5f84\u65e0\u6548 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2D608"},"#I2D608")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(b.b)("inlineCode",{parentName:"li"},"DefaultDbContext")," \u4e0d\u80fd\u8bc6\u522b ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2DCZX"},"#I2DCZX")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u5404\u5206\u5c42\u9879\u76ee ",Object(b.b)("inlineCode",{parentName:"li"},"Startup.cs")," \u652f\u6301 ",Object(b.b)("inlineCode",{parentName:"li"},"Configuration")," ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2DDUP"},"#I2DDUP")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Aop")," \u65e0\u6cd5\u62e6\u622a\uff0c\u65e0\u6548 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2DEY8"},"#I2DEY8")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(b.b)("inlineCode",{parentName:"li"},"mysql")," \u6267\u884c ",Object(b.b)("inlineCode",{parentName:"li"},"Add-Migration")," \u62a5\u9519 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2DSB8"},"#I2DSB8"),"\\"),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Entity")," \u521b\u5efa\u65f6\u95f4\u548c\u662f\u5426\u5220\u9664\u6dfb\u52a0\u9ed8\u8ba4\u503c ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2E04H"},"#I2E04H")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(b.b)("inlineCode",{parentName:"li"},"swagger")," \u4e2d\u591a\u4e2a ",Object(b.b)("inlineCode",{parentName:"li"},"servers")," \u8bbe\u7f6e ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2E0IF"},"#I2E0IF")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u5168\u5c40\u7b5b\u9009\u5668 \u6ca1\u6709\u6267\u884c ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2E5R4"},"#I2E5R4")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u591a\u6570\u636e\u5e93\u5b9a\u4f4d\u5668\u7591\u95ee ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2E77T"},"#I2E77T")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(b.b)("inlineCode",{parentName:"li"},"cli.ps")," \u9006\u5411\u5de5\u7a0b ",Object(b.b)("inlineCode",{parentName:"li"},"Mysql")," \u6570\u636e\u5e93\u62a5\u9519 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2E7I5"},"#I2E7I5")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Swagger")," \u5f00\u53d1\u73af\u5883 ",Object(b.b)("inlineCode",{parentName:"li"},"applicationsettings.json")," \u4e2d\u6587\u4e71\u7801 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2EAG1"},"#I2EAG1")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u589e\u52a0\u6307\u5b9a\u8def\u5f84\u7a0b\u5e8f\u96c6\u6620\u5c04 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2EEO2"},"#I2EEO2")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u52a8\u6001\u7f16\u8bd1 ",Object(b.b)("inlineCode",{parentName:"li"},"cs")," \u811a\u672c\u6587\u4ef6 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2EH66"},"#I2EH66")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u81ea\u5b9a\u4e49\u4e2d\u95f4\u4ef6\uff0c\u8fd4\u56de\u7684\u9519\u8bef\u6ca1\u6709\u89c4\u8303\u5316\u7ed3\u679c ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2NV8S"},"#I2NV8S")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Swagger")," \u5faa\u73af\u5f15\u7528\u8bbe\u7f6e\u751f\u6210\u6587\u6863\u5c42\u7ea7\u65e0\u6548 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2PLQQ"},"#I2PLQQ")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u914d\u7f6e\u6587\u4ef6\u652f\u6301 ",Object(b.b)("inlineCode",{parentName:"li"},"yaml")," \u6587\u4ef6\u5417? ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2TJ3N"},"#I2TJ3N")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u4fee\u6539\u6570\u636e\u5e93\u672a ",Object(b.b)("inlineCode",{parentName:"li"},"mysql")," \u6267\u884c ",Object(b.b)("inlineCode",{parentName:"li"},"Add-Migration")," \u62a5\u9519 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2VR64"},"#I2VR64")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u591a\u6570\u636e\u5e93\u4f7f\u7528\u5b9a\u4f4d\u5668\u65f6\u62a5\u9519 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2VR8F"},"#I2VR8F")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Migration To Oracle")," \u5f02\u5e38 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2WBYQ"},"#I2WBYQ")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u5f00\u53d1\u65f6\u663e\u793a ",Object(b.b)("inlineCode",{parentName:"li"},"Swagger"),"\uff0c\u4e0a\u7ebf\u65f6\u5173\u95ed ",Object(b.b)("inlineCode",{parentName:"li"},"Swagger"),"\uff0c\u8fd9\u9700\u8981\u600e\u4e48\u914d\u7f6e ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2WOYV"},"#I2WOYV")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u517c\u5bb9 Mvc \u590d\u6742\u9a8c\u8bc1\u6ca1\u6709\u8bd5\u9a8c\u6210\u529f ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2X3GV"},"#I2X3GV")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Aop")," \u80fd\u4e0d\u80fd\u652f\u6301\u65e0\u63a5\u53e3\u7684\u7c7b ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2X8AS"},"#I2X8AS")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u5173\u4e8e ",Object(b.b)("inlineCode",{parentName:"li"},"JWT Token")," \u81ea\u52a8\u5237\u65b0\u95ee\u9898 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2YD4K"},"#I2YD4K")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u80fd\u5426\u589e\u52a0\u4e00\u4e2a\u62d3\u5c55\u7684 ",Object(b.b)("inlineCode",{parentName:"li"},"Entity"),"\uff0c\u589e\u52a0\u4e00\u4e9b\u62d3\u5c55\u7684\u5c5e\u6027 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2YDKT"},"#I2YDKT")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Furion")," \u65e0\u6cd5\u8fd8\u539f\u5305\uff0c\u4f7f\u7528",Object(b.b)("inlineCode",{parentName:"li"},"Nuget")," \u4e0b\u8f7d\u548c\u901a\u8fc7\u6700\u65b0\u7684\u7684\u811a\u624b\u67b6\u4e0b\u8f7d\u90fd\u63d0\u793a\u8fd9\u4e2a\u95ee\u9898 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I30446"},"#I30446")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u590d\u6742\u6821\u9a8c\u4e0e\u7279\u6027\u9a8c\u8bc1\u4e0d\u80fd\u5e76\u884c ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I3046U"},"#I3046U")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u4e0d\u505a\u5b9e\u73b0")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u5f15\u5165 Webhook \u673a\u5236 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2A3I0"},"#I2A3I0")),Object(b.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u589e\u52a0 blog \u5b58\u50a8\u670d\u52a1 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2AMBP"},"#I2AMBP")),Object(b.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," Blazor Server \u73af\u5883\u4e0b EF \u7684 DbContext \u591a\u7ebf\u7a0b\u95ee\u9898 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2AMD2"},"#I2AMD2")),Object(b.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u5e0c\u671b\u5b9e\u73b0\u5de5\u4f5c\u5355\u5143\u64cd\u4f5c\u63a5\u53e3\uff08IUnitOfWork\uff09",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2AOR5"},"#I2AOR5")),Object(b.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u5efa\u8bae\u65b0\u589e ",Object(b.b)("inlineCode",{parentName:"li"},"string.ToPagedListAsync()")," \u64cd\u4f5c ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2BZ3Z"},"#I2BZ3Z")),Object(b.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u5efa\u8bae\u65b0\u589e ",Object(b.b)("inlineCode",{parentName:"li"},"GraphQL"),"\uff0c",Object(b.b)("inlineCode",{parentName:"li"},"OData")," \u529f\u80fd ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2C9EH"},"#I2C9EH")),Object(b.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u8feb\u5207\u671f\u671b\u652f\u6301 CAP \u5206\u5e03\u5f0f\u4e8b\u52a1 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2CBRF"},"#I2CBRF")),Object(b.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u5982\u4f55\u8ba9\u67d0\u4e2a\u65b9\u6cd5\u6216\u5b9e\u4f53\u53d8\u5316\u540e\uff0c\u4e0d\u88ab ",Object(b.b)("inlineCode",{parentName:"li"},"SavingChangesEvent")," \u7b49\u62e6\u622a ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2CEM9"},"#I2CEM9")),Object(b.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u5efa\u8bae\u65e5\u5fd7\u5c01\u88c5\u589e\u52a0\u66f4\u591a\u62d3\u5c55\uff0c\u6bd4\u5982\uff1a\u81ea\u5b9a\u4e49\u4fdd\u5b58\u65e5\u5fd7\u6587\u4ef6 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2CW8V"},"#I2CW8V")),Object(b.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u5bf9 ",Object(b.b)("inlineCode",{parentName:"li"},"SqlSugar")," \u7684\u652f\u6301\uff0c\u589e\u52a0 ",Object(b.b)("inlineCode",{parentName:"li"},"Nuget")," \u811a\u624b\u67b6 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2D91U"},"#I2D91U")),Object(b.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u4f7f\u7528 ",Object(b.b)("inlineCode",{parentName:"li"},"Middleware")," \u5b9e\u73b0\u53cd\u5411\u4ee3\u7406 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2DKM1"},"#I2DKM1")),Object(b.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u652f\u6301\u914d\u7f6e\u591a\u4e2a ",Object(b.b)("inlineCode",{parentName:"li"},"Aop")," \u529f\u80fd ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2E6Z2"},"#I2E6Z2")),Object(b.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u662f\u5426\u8ba1\u5212\u5f00\u53d1\u7c7b\u4f3c\u7f51\u5173\u7684\u529f\u80fd ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2PD1L"},"#I2PD1L")),Object(b.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," ",Object(b.b)("inlineCode",{parentName:"li"},"waring CS8002"),": \u5f15\u7528\u7a0b\u5e8f\u96c6 ",Object(b.b)("inlineCode",{parentName:"li"},"Furion")," \u6ca1\u6709\u5f3a\u540d\u79f0 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2WDN2"},"#I2WDN2")),Object(b.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," Oracle \u6570\u636e\u5e93\u9a71\u52a8\u96c6\u6210 ",Object(b.b)("inlineCode",{parentName:"li"},"Devart.Data.Oracle.Entity.EFCore")," ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2XJIU"},"#I2XJIU"))))),Object(b.b)("hr",null),Object(b.b)("h2",{id:"v170\uff08\u5df2\u53d1\u5e03\uff09"},"v1.7.0\uff08\u5df2\u53d1\u5e03\uff09"),Object(b.b)("ul",null,Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u65b0\u7279\u6027")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Furion.Extras.ObjectMapper.Mapster")," \u62d3\u5c55\u5305 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29LSJ"},"#I29LSJ")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Furion.Extras.Logging.Serilog")," \u62d3\u5c55\u5305 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2AAN8"},"#I2AAN8")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Furion.Extras.Web.HttpContext")," \u62d3\u5c55\u5305 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29LSM"},"#I29LSM")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u5185\u7f6e ",Object(b.b)("inlineCode",{parentName:"li"},"Token")," \u5237\u65b0\u673a\u5236\u652f\u6301 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29K57"},"#I29K57")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u52a8\u6001\u6570\u636e\u5e93\u4e0a\u4e0b\u6587\uff0c\u652f\u6301\u8fd0\u884c\u65f6\u6267\u884c ",Object(b.b)("inlineCode",{parentName:"li"},"OnModelCreating")," ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I28UDT"},"#I28UDT")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u652f\u6301\u4f9d\u8d56\u6ce8\u5165\u6392\u9664\u6307\u5b9a\u63a5\u53e3 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29693"},"#I29693")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u89c4\u8303\u5316\u7ed3\u679c\u8fd4\u56de\u65f6\u95f4\u6233\u5b57\u6bb5 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29697"},"#I29697")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u57fa\u7840 ",Object(b.b)("inlineCode",{parentName:"li"},"CURD")," \u7236\u7c7b\u64cd\u4f5c\u4f8b\u5b50 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I296SR"},"#I296SR")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},'sql.Change("\u5b9a\u4f4d\u5668\u5b8c\u6574\u7c7b\u578b\u540d\u79f0")')," \u652f\u6301 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29LAB"},"#I29LAB")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"UpdateInclude")," \u548c ",Object(b.b)("inlineCode",{parentName:"li"},"UpdateExclude")," \u5ffd\u7565\u7a7a\u53c2\u6570\u652f\u6301 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29VUG"},"#I29VUG")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u6570\u636e\u5e93\u4e0a\u4e0b\u6587\u5185\u7f6e\u5047\u5220\u9664\u67e5\u8be2\u8fc7\u6ee4\u5668\u652f\u6301 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29Y2R"},"#I29Y2R")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u5ffd\u7565\u7a7a\u503c\u6392\u9664\u9ed8\u8ba4\u65f6\u95f4\u683c\u5f0f ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29VUV"},"#I29VUV")),Object(b.b)("li",{parentName:"ul"},"[\u5347\u7ea7]"," ",Object(b.b)("inlineCode",{parentName:"li"},"MiniProfiler")," \u7ec4\u4ef6 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I297R9"},"#I297R9")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u7a81\u7834\u6027\u53d8\u5316")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," ",Object(b.b)("inlineCode",{parentName:"li"},"AppAuthorizeHandler")," \u6388\u6743\u7ba1\u9053\u4e3a\u5f02\u6b65\u5904\u7406 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29MD9"},"#I29MD9")),Object(b.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Swagger")," \u9ed8\u8ba4\u542f\u7528 ",Object(b.b)("inlineCode",{parentName:"li"},"JWT")," \u6388\u6743\u652f\u6301 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29LI4"},"#I29LI4")),Object(b.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," ",Object(b.b)("inlineCode",{parentName:"li"},"HttpContextUtilities")," \u540d\u79f0\u6539\u4e3a ",Object(b.b)("inlineCode",{parentName:"li"},"HttpContextLocal")," ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29KQE"},"#I29KQE")),Object(b.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," ",Object(b.b)("inlineCode",{parentName:"li"},"UnifyResultContext")," \u540d\u79f0\u6539\u4e3a ",Object(b.b)("inlineCode",{parentName:"li"},"UnifyContext")," ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29LLZ"},"#I29LLZ")),Object(b.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," \u53ea\u6709\u6267\u884c\u8fc1\u79fb\u547d\u4ee4\u624d\u626b\u63cf\u79cd\u5b50\u6570\u636e ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29E6P"},"#I29E6P")),Object(b.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," \u89c4\u8303\u5316\u7ed3\u679c ",Object(b.b)("inlineCode",{parentName:"li"},"Successed")," \u5c5e\u6027\u540d\u4e3a ",Object(b.b)("inlineCode",{parentName:"li"},"Succeeded")," ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29NMV"},"#I29NMV")),Object(b.b)("li",{parentName:"ul"},"[\u79fb\u9664]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Mapster")," \u5bf9\u8c61\u7ec4\u4ef6\uff0c\u91c7\u7528\u63d0\u4f9b\u62d3\u5c55\u65b9\u5f0f ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29D2M"},"#I29D2M")),Object(b.b)("li",{parentName:"ul"},"[\u79fb\u9664]"," ",Object(b.b)("inlineCode",{parentName:"li"},"CacheManager")," \u62d3\u5c55\u7c7b ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29LU1"},"#I29LU1")),Object(b.b)("li",{parentName:"ul"},"[\u91cd\u6784]"," ",Object(b.b)("inlineCode",{parentName:"li"},"SaveChanges")," \u62e6\u622a\u5668 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I292LO"},"#I292LO")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u95ee\u9898\u4fee\u590d")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u672a\u6ce8\u518c\u7684\u6570\u636e\u5e93\u4e0a\u4e0b\u6587\u4e5f\u88ab\u5f15\u7528\u5168\u5c40\u67e5\u8be2\u62e6\u622a\u5668 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29ZXJ"},"#I29ZXJ")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u624b\u52a8\u8fd4\u56de ",Object(b.b)("inlineCode",{parentName:"li"},"BadObjectResult")," \u6216 ",Object(b.b)("inlineCode",{parentName:"li"},"ValidationProblemDetails")," \u7ed3\u679c\u7c7b\u578b\u65f6\u89c4\u8303\u5316\u7ed3\u679c\u5931\u6548 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29ZU9"},"#I29ZU9")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u52a8\u6001 WebApi ",Object(b.b)("inlineCode",{parentName:"li"},"KeepName"),"\uff0c",Object(b.b)("inlineCode",{parentName:"li"},"KeepVerb"),"\u3001",Object(b.b)("inlineCode",{parentName:"li"},"SplitCamelCase")," \u65e0\u6548 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29X90"},"#I29X90")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Sql\u4ee3\u7406")," \u8fd4\u56de ",Object(b.b)("inlineCode",{parentName:"li"},"\u5143\u7ec4")," \u7c7b\u578b\u51fa\u9519 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29SMV"},"#I29SMV")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"401\uff0c403")," \u72b6\u6001\u7801\u89c4\u8303\u5316\u8fd4\u56de\u503c\u5c5e\u6027\u53d8\u5927\u5199 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29M8Y"},"#I29M8Y")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"HttpContext")," \u7a7a\u5f02\u5e38 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29LU4"},"#I29LU4")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u63a5\u53e3\u65e0\u8fd4\u56de\u503c\u6ca1\u6709\u5e94\u7528\u89c4\u8303\u5316\u7ed3\u679c bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29GT7"},"#I29GT7")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u524d\u7aef ",Object(b.b)("inlineCode",{parentName:"li"},"Less")," \u914d\u7f6e\u6587\u4ef6\u5bfc\u81f4\u4e3b\u673a\u542f\u52a8\u5931\u8d25 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29E7P"},"#I29E7P")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u6267\u884c ",Object(b.b)("inlineCode",{parentName:"li"},"sql")," \u7ed3\u679c\u8f6c\u6cdb\u578b\u540e\u5c5e\u6027\u91cd\u590d\u8d4b\u503c bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29BUO"},"#I29BUO")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Swagger")," \u5173\u95ed ",Object(b.b)("inlineCode",{parentName:"li"},"MiniProfiler")," \u4e4b\u540e ",Object(b.b)("inlineCode",{parentName:"li"},"\u7ec4\u4e2d\u7ec4")," \u5931\u6548 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29789"},"#I29789")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u672a\u542f\u7528\u89c4\u8303\u5316\u7ed3\u679c\u65f6\u5f02\u5e38\u8fd4\u56de ",Object(b.b)("inlineCode",{parentName:"li"},"System.Object")," \u5b57\u7b26 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2969A"},"#I2969A")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u6b63\u6570\u6570\u636e\u9a8c\u8bc1 0 \u4e5f\u9a8c\u8bc1\u901a\u8fc7 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2955T"},"#I2955T")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u975e\u6cdb\u578b\u7c7b\u96c6\u6210\u6cdb\u578b\u63a5\u53e3\u4f9d\u8d56\u6ce8\u5165 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I294YT"},"#I294YT")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Swagger")," \u4e0d\u652f\u6301 ",Object(b.b)("inlineCode",{parentName:"li"},"new")," \u8986\u76d6\u7236\u7c7b\u7684 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I28Z1A"},"#I28Z1A")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"JsonSerializerUtility")," \u6ca1\u6709\u516c\u5f00 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I28WMI"},"#I28WMI")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"SqlSugar")," \u62d3\u5c55\u67e5\u8be2\u6cdb\u578b\u7c7b\u578b\u6ce8\u518c\u5f02\u5e38 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I28VMT"},"#I28VMT")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Furion Tools")," \u4e0d\u652f\u6301\u751f\u6210\u4e0d\u540c\u547d\u540d\u7a7a\u95f4\u7684\u5b9e\u4f53 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2A175"},"#I2A175")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u5168\u5c40\u62e6\u622a\u5668\u65e0\u6548 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2A7T2"},"#I2A7T2")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u65b0\u589e\u6216\u66f4\u65b0\u5ffd\u7565\u7a7a\u503c\u7a7a\u5f02\u5e38 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2AB6C"},"#I2AB6C")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u5176\u4ed6\u66f4\u6539")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u4f18\u5316]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Token")," \u751f\u6210\u52a0\u5bc6\u7b97\u6cd5 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29KIH"},"#I29KIH")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u6587\u6863\u53d8\u5316")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u65e5\u5fd7\u6587\u6863 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I28Y9D"},"#I28Y9D")),Object(b.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," \u6570\u636e\u5e93\u4e0a\u4e0b\u6587\u3001\u5b9e\u4f53\u62e6\u622a\u5668\u3001\u914d\u7f6e\u3001\u4e00\u5206\u949f\u5165\u95e8\u7b49\u7b49\u6587\u6863"))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u95ee\u7b54\u7b54\u7591")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u95ee\u7b54]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Swagger")," \u5982\u4f55\u5b9e\u73b0\u6388\u6743\u8bbf\u95ee ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I294F2"},"#I294F2")),Object(b.b)("li",{parentName:"ul"},"[\u95ee\u7b54]"," \u5982\u4f55\u5b9e\u73b0\u591a\u4e2a\u6570\u636e\u5e93\u591a\u5bf9\u591a\u5b9e\u4f53\u914d\u7f6e ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29G6S"},"#I29G6S")),Object(b.b)("li",{parentName:"ul"},"[\u95ee\u7b54]"," \u52a8\u6001 WebApi \u652f\u6301\u6587\u4ef6\u4e0a\u4f20\u5417 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29R5E"},"#I29R5E")),Object(b.b)("li",{parentName:"ul"},"[\u7591\u95ee]"," \u591a\u4e2a\u6570\u636e\u5e93\u4e0a\u4e0b\u6587\u65e0\u6cd5\u751f\u6210\u8fc1\u79fb\u4ee3\u7801 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2A6II"},"#I2A6II")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u4e0d\u505a\u5b9e\u73b0")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u5b9e\u73b0 ",Object(b.b)("inlineCode",{parentName:"li"},"BuildChange")," \u4f20\u5165\u8868\u540d ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I292SN"},"#I292SN")),Object(b.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u6267\u884c\u6570\u636e\u5e93\u64cd\u4f5c\u7ed3\u679c\u4e0d\u652f\u6301\u5c5e\u6027\u5ffd\u7565\u5927\u5c0f\u5199\u8d4b\u503c ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29DRQ"},"#I29DRQ")),Object(b.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u5f15\u5165 ",Object(b.b)("inlineCode",{parentName:"li"},"Webhook")," \u673a\u5236 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2A3I0"},"#I2A3I0"))))),Object(b.b)("hr",null),Object(b.b)("h2",{id:"v140\uff08\u5df2\u53d1\u5e03\uff09"},"v1.4.0\uff08\u5df2\u53d1\u5e03\uff09"),Object(b.b)("ul",null,Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u65b0\u7279\u6027")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Furion")," \u652f\u6301\u4e8c\u7ea7\u865a\u62df\u76ee\u5f55\u90e8\u7f72\u529f\u80fd ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I28B77"},"#I28B77")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Furion.Template.RazorWithWebApi")," \u811a\u624b\u67b6 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I28QGI"},"#I28QGI")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Furion.Template.BlazorWithWebApi")," \u811a\u624b\u67b6 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I27Z3O"},"#I27Z3O")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"EFCore")," \u65f6\u6001\u67e5\u8be2\u62d3\u5c55 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I28AJ6"},"#I28AJ")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"[AppDbContext(\u8fde\u63a5\u5b57\u7b26\u4e32\uff0c\u6570\u636e\u5e93\u7c7b\u578b)]")," \u914d\u7f6e\u652f\u6301 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I28QTB"},"#I28QTB")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"DateTimeOffset")," \u8f6c ",Object(b.b)("inlineCode",{parentName:"li"},"DateTime")," \u62d3\u5c55\u65b9\u6cd5 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I27MQA"},"#I27MQA")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"ValidationTypes")," \u9a8c\u8bc1\u6b63\u5219\u8868\u8fbe\u5f0f\u667a\u80fd\u63d0\u793a ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2801V"},"#I2801V")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"ValiationTypes.WordWithNumber")," \u9a8c\u8bc1 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2805A"},"#I2805")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u83b7\u53d6\u5ba2\u6237\u7aef\u548c\u670d\u52a1\u7aef IP \u5730\u5740 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I28QV9"},"#I28QV9")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u7a81\u7834\u6027\u53d8\u5316")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u5347\u7ea7]"," .NET 5.0 \u7248\u672c\u81f3 .NET 5.0.1 \u7248\u672c ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I28QU1"},"#I28QU")),Object(b.b)("li",{parentName:"ul"},"[\u91cd\u6784]"," \u89c6\u56fe\u5f15\u64ce\u529f\u80fd\uff0c\u4f18\u5316\u4e0d\u89c4\u8303\u547d\u540d\u548c\u65b0\u589e\u5b57\u7b26\u4e32\u6a21\u677f\u7f16\u8bd1 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I28G0S"},"#I28G0S")),Object(b.b)("li",{parentName:"ul"},"[\u91cd\u6784]"," \u6570\u636e\u5e93\u5b9e\u4f53\u67e5\u627e\u7b97\u6cd5\uff0c\u5e76\u4f18\u5316\u6027\u80fd ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I28QUQ"},"#I28QUQ")),Object(b.b)("li",{parentName:"ul"},"[\u4f18\u5316]"," \u5e94\u7528\u542f\u52a8\u521d\u59cb\u5316\u6027\u80fd\u548c\u6570\u636e\u5e93\u7b2c\u4e00\u6b21\u81ea\u52a8\u914d\u7f6e ",Object(b.b)("inlineCode",{parentName:"li"},"DbSet")," \u6027\u80fd"))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u95ee\u9898\u4fee\u590d")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u591a\u6570\u636e\u5e93\u4e0a\u4e0b\u6587\u914d\u7f6e\u5b9a\u4f4d\u5668\u540e\u5b9e\u4f53\u65e0\u6cd5\u6b63\u786e\u751f\u6210 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2888L"},"#I2888L")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u591a\u79df\u6237\u6570\u636e\u5e93\u4e0a\u4e0b\u6587\u5b9e\u4f53\u751f\u6210 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2891G"},"#I2891G")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u5bf9\u8c61\u9a8c\u8bc1\u5931\u8d25\u63d0\u793a\u6d88\u606f\u6ca1\u6709\u5e94\u7528 ",Object(b.b)("inlineCode",{parentName:"li"},"JSON")," \u5927\u5c0f\u5199\u914d\u7f6e bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I27UTX"},"#I27UTX")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u4ed3\u50a8 ",Object(b.b)("inlineCode",{parentName:"li"},"Insert")," \u6216 ",Object(b.b)("inlineCode",{parentName:"li"},"Update")," \u65b9\u6cd5\u6307\u5b9a ",Object(b.b)("inlineCode",{parentName:"li"},"ignoreNullValues")," \u65e0\u6548 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I27UN6"},"#I27UN6")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Controller")," \u6d3e\u751f\u7c7b\u5982\u679c\u8d34\u4e86 ",Object(b.b)("inlineCode",{parentName:"li"},"[Route]")," \u7279\u6027\u540e\u51fa\u73b0\u5728 ",Object(b.b)("inlineCode",{parentName:"li"},"Swagger")," \u4e2d bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I27TN7"},"#I27TN7")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"SqlScalar")," \u6267\u884c ",Object(b.b)("inlineCode",{parentName:"li"},"sql")," \u8fd4\u56de ",Object(b.b)("inlineCode",{parentName:"li"},"Nullable")," \u7c7b\u578b\u51fa\u73b0\u8f6c\u6362\u5931\u8d25 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I27S2N"},"#I27S2N")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"[UnitOfWork]")," \u7279\u6027\u5f02\u5e38 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I27MLM"},"#I27MLM")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"sql")," \u9759\u6001\u6267\u884c\u65b9\u5f0f\u548c ",Object(b.b)("inlineCode",{parentName:"li"},"sql")," \u9ad8\u7ea7\u4ee3\u7406\u65e0\u6cd5\u76d1\u542c\u6570\u636e\u5e93\u8fde\u63a5\u72b6\u6001 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I27M4F"},"#I27M4F")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u4fee\u590d\u66f4\u6362 Json \u5e8f\u5217\u5316\u5e93\u65e0\u6548 bug\uff0c\u5982\u66ff\u6362\u4e3a ",Object(b.b)("inlineCode",{parentName:"li"},"Microsoft.AspNetCore.Mvc.NewtonsoftJson")," ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I27M43"},"#I27M43")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Furion Tools")," \u5de5\u5177\u751f\u6210\u6a21\u578b bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I27XI5"},"#I27XI5")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u8f6f\u5220\u9664\u6ca1\u6709\u751f\u6548 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2804I"},"#I2804I")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Furion Tools")," \u8bc6\u522b\u5e26\u591a\u4e2a ",Object(b.b)("inlineCode",{parentName:"li"},"\\\\")," \u7684\u8fde\u63a5\u5b57\u7b26\u4e32\u8bc6\u522b bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I280TS"},"#I280TS"),"\uff0c",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/pulls/91"},"#PR91")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Furion Tools")," \u65e0\u6cd5\u53d6\u6d88\u751f\u6210 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2816M"},"#I2816M")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"DateTimeOffset")," \u8f6c\u672c\u5730\u65f6\u95f4\u5dee 8 \u5c0f\u65f6 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I28BA9"},"#I28BA9")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u542f\u7528 ",Object(b.b)("inlineCode",{parentName:"li"},"bundle js&css")," \u538b\u7f29\u540e\u542f\u52a8\u5f02\u5e38 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I28KRP"},"#I28KR")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"ValidationTypes.Required")," \u65e0\u6548 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/pulls/98"},"#PR98")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u89c4\u8303\u5316\u7ed3\u679c",Object(b.b)("inlineCode",{parentName:"li"},"OnValidateFailed")," \u53c2\u6570\u540d\u62fc\u5199\u9519\u8bef bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/pulls/93"},"#PR93"),"\uff0c",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/pulls/92"},"#PR92")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u6388\u6743\u7ba1\u9053\u9a8c\u8bc1\u5931\u8d25\u8fd8\u663e\u793a\u7ed3\u679c bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/pulls/89"},"#PR89")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u5176\u4ed6\u66f4\u6539")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u66f4\u65b0]"," README.md \u53cb\u60c5\u8fde\u63a5\u5730\u5740 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/pulls/88"},"#PR88")),Object(b.b)("li",{parentName:"ul"},"[\u66f4\u65b0]"," \u6a21\u677f\u811a\u624b\u67b6\u6e90\u7801\uff0c\u6dfb\u52a0 ",Object(b.b)("inlineCode",{parentName:"li"},"EFCore Tools")," \u5e93 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/pulls/87"},"#PR87")),Object(b.b)("li",{parentName:"ul"},"[\u66f4\u65b0]"," README.md Nuget \u56fe\u6807 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/pulls/85"},"#PR85")),Object(b.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u5c06 ",Object(b.b)("inlineCode",{parentName:"li"},"List")," \u8f6c ",Object(b.b)("inlineCode",{parentName:"li"},"DateTable")," ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/pulls/97"},"#PR97")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u6587\u6863\u53d8\u5316")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u89c6\u56fe\u5f15\u64ce\u6a21\u677f\u6587\u6863 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I27ZVA"},"#I27ZVA")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"EFCore")," \u65f6\u6001\u67e5\u8be2\u6587\u6863 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I28AJ6"},"#I28AJ"),", ",Object(b.b)("a",{parentName:"li",href:"https://dotnetchina.gitee.io/furion/docs/dbcontext-hight-query/#91111-%E6%97%B6%E6%80%81%E6%9F%A5%E8%AF%A2"},"DOC")),Object(b.b)("li",{parentName:"ul"},"[\u66f4\u65b0]"," \u4ed3\u50a8\u6587\u6863\u4e66\u5199\u7eb0\u6f0f bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/pulls/90"},"#PR90")),Object(b.b)("li",{parentName:"ul"},"[\u66f4\u65b0]"," \u9009\u9879\u6587\u6863\u9519\u8bef bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/pulls/86"},"#PR86")),Object(b.b)("li",{parentName:"ul"},"[\u66f4\u65b0]"," ",Object(b.b)("inlineCode",{parentName:"li"},"\u5b9e\u4f53\u6570\u636e\u76d1\u542c\u5668")," \u6587\u6863\u4e66\u5199\u9519\u8bef bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/pulls/83/files"},"#PR83")),Object(b.b)("li",{parentName:"ul"},"[\u66f4\u65b0]"," \u6570\u636e\u5e93\u4e0a\u4e0b\u6587\u3001\u591a\u6570\u636e\u5e93\u3001\u811a\u624b\u67b6\u7b49\u6587\u6863"))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u95ee\u7b54\u7b54\u7591")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u5efa\u8bae]"," \u5e0c\u671b ",Object(b.b)("inlineCode",{parentName:"li"},"api")," \u8fd4\u56de\u7684\u503c\u81ea\u52a8\u5c06 null \u8f6c\u4e3a '' \u6216 ","[][#I286IJ]","(",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I286IJ)%EF%BC%8C%E3%80%90%E5%B7%B2%E5%85%B3%E9%97%AD%E3%80%91"},"https://gitee.com/dotnetchina/Furion/issues/I286IJ)\uff0c\u3010\u5df2\u5173\u95ed\u3011")),Object(b.b)("li",{parentName:"ul"},"[\u5efa\u8bae]"," \u6dfb\u52a0\u7f51\u5173\u529f\u80fd ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I27TP7"},"#I27TP7"),"\uff0c\u3010\u5df2\u5173\u95ed\u3011"),Object(b.b)("li",{parentName:"ul"},"[\u5efa\u8bae]"," \u65b0\u589e ",Object(b.b)("inlineCode",{parentName:"li"},"SqlQuery")," \u83b7\u53d6\u5355\u6761\u8bb0\u5f55\u65b9\u6cd5 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I28M1V"},"#I28M1V"),"\uff0c\u3010\u5df2\u5173\u95ed\u3011"),Object(b.b)("li",{parentName:"ul"},"[\u5efa\u8bae]"," \u5e0c\u671b\u53ef\u4ee5\u63d0\u4f9b\u96c6\u6210 ",Object(b.b)("inlineCode",{parentName:"li"},"Serilog")," \u4f8b\u5b50 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I282J4"},"#I282J4"),"\uff0c\u3010\u5df2\u5173\u95ed\u3011"),Object(b.b)("li",{parentName:"ul"},"[\u7591\u95ee]"," \u5982\u4f55\u901a\u8fc7\u7279\u6027\u914d\u7f6e\u552f\u4e00\u7ea6\u675f ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2891L"},"#I2891L"),"\uff0c\u3010\u5df2\u5173\u95ed\u3011"),Object(b.b)("li",{parentName:"ul"},"[\u7591\u95ee]"," \u600e\u4e48\u8bfb\u53d6 ",Object(b.b)("inlineCode",{parentName:"li"},"appsettings.json")," \u6570\u7ec4 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I27WUR"},"#I27WU"),"\uff0c\u3010\u5df2\u5173\u95ed\u3011"),Object(b.b)("li",{parentName:"ul"},"[\u7591\u95ee]"," ",Object(b.b)("inlineCode",{parentName:"li"},"IRepository")," \u51fa\u73b0\u7a7a\u5f02\u5e38 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I281IE"},"#I281IE"),"\uff0c\u3010\u5df2\u5173\u95ed\u3011"),Object(b.b)("li",{parentName:"ul"},"[\u7591\u95ee]"," \u89c4\u8303\u5316\u63a5\u53e3\u95ee\u9898\u95ee\u9898 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I28NMZ"},"#I28NMZ"),"\uff0c\u3010\u5df2\u5173\u95ed\u3011"),Object(b.b)("li",{parentName:"ul"},"[\u7591\u95ee]"," \u7edf\u4e00\u8fd4\u56de\u503c\u6a21\u578b\u4e2d OnResponseStatusCodes \u672a\u6267\u884c ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I28NNL"},"#I28NNL"),"\uff0c\u3010\u5df2\u5173\u95ed\u3011")))),Object(b.b)("hr",null),Object(b.b)("h2",{id:"v120\uff08\u5df2\u53d1\u5e03\uff09"},"v1.2.0\uff08\u5df2\u53d1\u5e03\uff09"),Object(b.b)("ul",null,Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u65b0\u7279\u6027")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u96ea\u82b1\u7b97\u6cd5 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I26OXG"},"#I26OXG"),", ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/pulls/78"},"#PR78")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"[AppDbContext]")," \u914d\u7f6e\u6570\u636e\u5e93\u63d0\u4f9b\u5668\u652f\u6301 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I27G3T"},"#I27G3T")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u5b9e\u4f53\u8868\u6570\u636e\u66f4\u6539\u76d1\u542c\u63a5\u53e3 ",Object(b.b)("inlineCode",{parentName:"li"},"IEntityDataChangedListener")," ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I278DD"},"#I278DD"),", ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I278LQ"},"#I278LQ")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u5168\u5c40\u670d\u52a1\u63a5\u53e3 AOP \u62e6\u622a\u529f\u80fd ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I278CP"},"#I278CP")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u5b9a\u4f4d\u5668\u4ed3\u50a8 ",Object(b.b)("inlineCode",{parentName:"li"},"IDbRepository")," ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I276Q3"},"#I276Q3")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u6570\u636e\u5e93\u64cd\u4f5c ",Object(b.b)("inlineCode",{parentName:"li"},"InsertOrUpdate")," \u652f\u6301\u6392\u9664\u7a7a\u5b57\u7b26\u4e32\u529f\u80fd ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I272OG"},"#I272OG")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u6570\u636e\u5e93\u64cd\u4f5c ",Object(b.b)("inlineCode",{parentName:"li"},"UpdateInclude")," \u548c ",Object(b.b)("inlineCode",{parentName:"li"},"UpdateExclude")," \u533f\u540d\u5bf9\u8c61\u652f\u6301 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I271X0"},"#I271X0")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u6570\u636e\u9a8c\u8bc1\u4f20\u5165\u7a7a\u5bf9\u8c61\u8df3\u8fc7\u9a8c\u8bc1\u652f\u6301 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I273R4"},"#I273R4")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u5e94\u7528\u542f\u52a8\u65f6\u652f\u6301\u6392\u9664\u7279\u5b9a\u914d\u7f6e\u6587\u4ef6\u81ea\u52a8\u52a0\u8f7d ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I26U0A"},"#I26U0A")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u5355\u4e2a\u5b9e\u4f53\u8868\u540d\u524d\u7f00\u652f\u6301 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I26LX0"},"#I26LX0")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"MySql")," \u6570\u636e\u5e93\u81ea\u52a8\u914d\u7f6e\u9ed8\u8ba4\u7248\u672c\u53f7 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I26XQ6"},"#I26XQ6")),Object(b.b)("li",{parentName:"ul"},"[\u4f18\u5316]"," \u6388\u6743\u5904\u7406\u7a0b\u5e8f\u4ee3\u7801"))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u7a81\u7834\u6027\u53d8\u5316")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u5b9e\u4f53\u8868\u6570\u636e\u66f4\u6539\u76d1\u542c\u63a5\u53e3 ",Object(b.b)("inlineCode",{parentName:"li"},"IEntityDataChangedListener")," ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I278DD"},"#I278DD"),", ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I278LQ"},"#I278LQ")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u5168\u5c40\u670d\u52a1\u63a5\u53e3 AOP \u62e6\u622a\u529f\u80fd ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I278CP"},"#I278CP")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u96ea\u82b1\u7b97\u6cd5 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I26OXG"},"#I26OXG"),", ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/pulls/78"},"#PR78")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u95ee\u9898\u4fee\u590d")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u89c6\u56fe\u5f15\u64ce\u52a0\u8f7d\u5916\u90e8\u7a0b\u5e8f\u96c6\u51fa\u9519 bug"),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u4f9d\u8d56\u6ce8\u5165\u4ee3\u7406\u63a5\u53e3\u62a5\u7a7a\u5bf9\u8c61\u5f02\u5e38 bug"),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"EFCore")," \u53d6\u6d88\u9644\u52a0\u5b9e\u4f53\u51fa\u9519 bug"),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u6570\u636e\u5e93\u4ed3\u50a8\u5728\u975e Web \u8bf7\u6c42\u4e0b\u51fa\u73b0\u7a7a\u5f02\u5e38 bug"),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u591a\u4e2a\u6388\u6743\u7b56\u7565\u5171\u5b58\u95ee\u9898\u51fa\u73b0\u65e0\u6548 bug"),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u53cb\u597d\u5f02\u5e38 ",Object(b.b)("inlineCode",{parentName:"li"},"Oop.Oh")," \u4e0d\u652f\u6301\u666e\u901a\u65b9\u6cd5 bug"),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u83b7\u53d6\u591a\u79df\u6237\u5bf9\u8c61\u65f6\u6570\u636e\u5e93\u4e0a\u4e0b\u6587\u51fa\u73b0\u4f5c\u7528\u57df\u9a8c\u8bc1\u5931\u8d25 bug"),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u5de5\u4f5c\u5355\u5143\u4e0d\u652f\u6301 ",Object(b.b)("inlineCode",{parentName:"li"},"Sql\u4ee3\u7406")," \u62e6\u622a bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I27GST"},"#I27GST")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u5176\u4ed6\u66f4\u6539")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u5173\u95ed][#I26O1F]","(",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I26O1F"},"https://gitee.com/dotnetchina/Furion/issues/I26O1F"),"), ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I27B2I"},"#I27B2I"),", ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I27BJ6"},"#I27BJ6"),", ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I27E5Z"},"#I27E5Z"),", ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I27EL4"},"#I27EL4")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u6587\u6863\u53d8\u5316")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e][\u5b9e\u4f53\u6570\u636e\u76d1\u542c\u5668]","(",Object(b.b)("a",{parentName:"li",href:"https://dotnetchina.gitee.io/furion/docs/dbcontext-entitytrigger"},"https://dotnetchina.gitee.io/furion/docs/dbcontext-entitytrigger"),") \u6587\u6863"),Object(b.b)("li",{parentName:"ul"},"[\u66f4\u65b0]"," \u4e00\u5206\u949f\u5165\u95e8\u3001\u5e94\u7528\u542f\u52a8\u3001\u5b98\u65b9\u811a\u624b\u67b6\u3001\u6570\u636e\u5e93\u64cd\u4f5c\u6307\u5357\u3001\u5bf9\u8c61\u6620\u5c04\u3001\u89c4\u8303\u5316\u6587\u6863\u3001\u5f02\u5e38\u5904\u7406\u3001\u9274\u6743\u6388\u6743\u6587\u6863")))),Object(b.b)("hr",null),Object(b.b)("h2",{id:"v110\uff08\u5df2\u53d1\u5e03\uff09"},"v1.1.0\uff08\u5df2\u53d1\u5e03\uff09"),Object(b.b)("ul",null,Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u65b0\u7279\u6027")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Db.GetDbContext()")," \u83b7\u53d6\u9ed8\u8ba4\u6570\u636e\u5e93\u4e0a\u4e0b\u6587\u65b9\u6cd5"),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"HttpContextUtility.GetCurrentHttpContext()")," \u83b7\u53d6\u5168\u5c40 ",Object(b.b)("inlineCode",{parentName:"li"},"HttpContext")," \u4e0a\u4e0b\u6587"),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"App.GetRequiredService<>")," \u89e3\u6790\u670d\u52a1\u65b9\u6cd5"),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"object.GetService<>")," \u5bf9\u8c61\u62d3\u5c55\u65b9\u6cd5"),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u7b56\u7565\u6388\u6743 ",Object(b.b)("inlineCode",{parentName:"li"},"PolicyPipeline")," \u57fa\u7c7b\u65b9\u6cd5\uff0c\u652f\u6301\u591a\u91cd\u5224\u65ad\u6388\u6743"),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"JWTEncryption.ValidateJwtBearerToken")," \u624b\u52a8\u9a8c\u8bc1\u9759\u6001\u65b9\u6cd5"),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u5168\u5c40\u6570\u636e\u5e93\u4e0a\u4e0b\u6587 ",Object(b.b)("inlineCode",{parentName:"li"},"InsertOrUpdateIgnoreNullValues")," \u548c ",Object(b.b)("inlineCode",{parentName:"li"},"EnabledEntityStateTracked")," \u5168\u5c40\u914d\u7f6e"),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Swagger Jwt\u6388\u6743")," \u5168\u5c40\u6388\u6743\u53c2\u6570 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I26GLR"},"#I26GLR")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"InsertOrUpdate")," \u652f\u6301\u81ea\u5b9a\u4e49\u5224\u65ad\u6761\u4ef6\u529f\u80fd ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I269Q1"},"#I269Q1")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u5b57\u7b26\u4e32\u5b57\u6bb5\u5c0f\u5199\u547d\u540d\u652f\u6301 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2695D"},"#I2695D")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u5b57\u7b26\u4e32\u6587\u672c\u5bf9\u6bd4\u529f\u80fd ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I268LE"},"#I268LE")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u5168\u5c40\u5f02\u5e38\u7279\u6027\u6d88\u606f\u529f\u80fd ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2662O"},"#I2662O")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Insert")," \u6216 ",Object(b.b)("inlineCode",{parentName:"li"},"Update")," \u6570\u636e\u5e93\u5ffd\u7565\u7a7a\u503c\u529f\u80fd ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I264Q4"},"#I264Q4")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u7a81\u7834\u6027\u53d8\u5316")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Fur")," \u9879\u76ee\u540d\u4e3a ",Object(b.b)("inlineCode",{parentName:"li"},"Furion")),Object(b.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Db.GetRequestDbContext<>()")," \u547d\u540d\u4e3a ",Object(b.b)("inlineCode",{parentName:"li"},"Db.GetDbContext<>()")),Object(b.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Db.GetDbContext<>()")," \u547d\u540d\u4e3a ",Object(b.b)("inlineCode",{parentName:"li"},"Db.GetDuplicateDbContext<>()")),Object(b.b)("li",{parentName:"ul"},"[\u91cd\u6784]"," ",Object(b.b)("inlineCode",{parentName:"li"},"App.GetService<>")," \u89e3\u6790\u670d\u52a1\u7684\u5e95\u5c42\u903b\u8f91\uff0c\u5927\u5927\u63d0\u9ad8\u4e86\u89e3\u6790\u670d\u52a1\u7684\u6027\u80fd"),Object(b.b)("li",{parentName:"ul"},"[\u91cd\u6784]"," \u6388\u6743\u6838\u5fc3\u4ee3\u7801\uff0c\u4fdd\u6301\u548c\u5fae\u8f6f\u4e00\u81f4\u7684\u6388\u6743\u89c4\u8303 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I26DCB"},"#I26DCB")),Object(b.b)("li",{parentName:"ul"},"[\u79fb\u9664]"," ",Object(b.b)("inlineCode",{parentName:"li"},"App.GetRequestService<>")," \u65b9\u6cd5"),Object(b.b)("li",{parentName:"ul"},"[\u79fb\u9664]"," ",Object(b.b)("inlineCode",{parentName:"li"},"ValidateJwtBearer")," Jwt \u6388\u6743\u65b9\u6cd5\uff0c\u65e0\u9700\u624b\u52a8\u5224\u65ad\u4e86"))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u95ee\u9898\u4fee\u590d")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," Furion \u5b98\u65b9\u811a\u624b\u67b6\u751f\u6210\u540e\u7f16\u8bd1\u5f02\u5e38 bug"),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Tenant")," \u5185\u7f6e\u5c5e\u6027\u4e0d\u662f ",Object(b.b)("inlineCode",{parentName:"li"},"virtual")," \u4fee\u9970 bug"),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"dockerfile")," \u65b0\u547d\u540d\u6784\u5efa\u5931\u8d25 bug"),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u81ea\u5b9a\u4e49\u89d2\u8272\u6388\u6743\u548c\u591a\u4e2a\u6388\u6743\u5171\u5b58\u51fa\u73b0 403 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I26H1L"},"#I26H1L")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"httpContext.GetEndpoint()")," \u7a7a\u5f02\u5e38 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/pulls/73"},"#PR73")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Oops.Oh")," \u7a7a\u5f02\u5e38\u548c\u4e0d\u652f\u6301\u670d\u52a1\u670d\u52a1\u629b\u5f02\u5e38 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I26EFU"},"#I26EFU"),"\uff0c",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I26GM4"},"#I26GM4")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"cli.ps")," \u751f\u6210\u6587\u4ef6\u7f16\u7801\u4e71\u7801 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I26DVT"},"#I26DVT")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Swagger")," \u6587\u4ef6\u4e0a\u4f20\u6309\u94ae\u4e0d\u663e\u793a ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I26B6U"},"#I26B6U")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u89c4\u8303\u5316\u7ed3\u679c\u6388\u6743\u72b6\u6001\u7801\u5e8f\u5217\u5316\u5927\u5c0f\u5199\u4e0d\u4e00\u81f4\u95ee\u9898 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I26B26"},"#I26B26")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u672a\u542f\u7528\u89c4\u8303\u5316\u7ed3\u679c\u65f6\u4e2d\u6587\u4e71\u7801 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I268T5"},"#I268T5")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"MySql")," \u5f02\u6b65\u5f02\u5e38\u6355\u83b7\u4e0d\u5230 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I265SO"},"#I265SO")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"cli.ps1")," \u63d0\u793a\u627e\u4e0d\u5230\u6570\u636e\u5e93\u8fde\u63a5\u5b57\u7b26\u4e32 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2647U"},"#I2647U")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u5176\u4ed6\u66f4\u6539")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u5176\u4ed6]"," \u4ee3\u7801\u6027\u80fd\u5c0f\u4f18\u5316\u548c\u5c0f\u8c03\u6574"),Object(b.b)("li",{parentName:"ul"},"[\u5173\u95ed][#I265JV]","(",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I265JV)%EF%BC%8C%5B#I26ERA%5D(https://gitee.com/dotnetchina/Furion/issues/I26ERA)%EF%BC%8C"},"https://gitee.com/dotnetchina/Furion/issues/I265JV)\uff0c[#I26ERA](https://gitee.com/dotnetchina/Furion/issues/I26ERA)\uff0c")," ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I26EVW"},"#I26EVW"),"\uff0c",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I26GHC"},"#I26GHC"),"\uff0c",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I26GJ1"},"#I26GJ1"),"\uff0c",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I26O1F"},"#I26O1F")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u6587\u6863\u53d8\u5316")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u66f4\u65b0]"," \u4e00\u5206\u949f\u5165\u95e8\u3001\u5b89\u5168\u9274\u6743\u3001\u6570\u636e\u5e93\u7b49\u6587\u6863")))),Object(b.b)("hr",null),Object(b.b)("h2",{id:"v103\uff08\u5df2\u53d1\u5e03\uff09"},"v1.0.3\uff08\u5df2\u53d1\u5e03\uff09"),Object(b.b)("ul",null,Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u65b0\u7279\u6027")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," Mvc \u6a21\u677f\u811a\u624b\u67b6\uff1a",Object(b.b)("inlineCode",{parentName:"li"},"Fur.Template.Mvc")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," WebApi \u6a21\u677f\uff1a",Object(b.b)("inlineCode",{parentName:"li"},"Fur.Template.Api")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," Mvc/WebApi \u6a21\u677f\uff1a",Object(b.b)("inlineCode",{parentName:"li"},"Fur.Template.App")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," Razar Pages \u6a21\u677f\uff1a",Object(b.b)("inlineCode",{parentName:"li"},"Fur.Template.Razor")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," Blazor \u6a21\u677f\uff1a",Object(b.b)("inlineCode",{parentName:"li"},"Fur.Template.Blazor")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u7a81\u7834\u6027\u53d8\u5316")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," ",Object(b.b)("inlineCode",{parentName:"li"},"PagedList")," \u5230 ",Object(b.b)("inlineCode",{parentName:"li"},"System.Collections.Generic")," \u547d\u540d\u7a7a\u95f4\u4e0b"),Object(b.b)("li",{parentName:"ul"},"[\u4f18\u5316]"," \u89e3\u6790\u670d\u52a1\u6027\u80fd\u95ee\u9898\uff0c\u5e95\u5c42\u4ee3\u7801\u5927\u91cf\u4f18\u5316"))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u95ee\u9898\u4fee\u590d")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"ApiSears.ControllerEnd"),"\u4e0d\u8d77\u4f5c\u7528 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I25KH6"},"#I25KH6")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"RemoteRequest")," \u8bf7\u6c42\u5b8c\u6210\u7ed3\u679c\u5e8f\u5217\u5316\u5c5e\u6027\u5927\u5c0f\u5199\u95ee\u9898 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I25I8R"},"#I25I8R")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"HttpContext.GetEndpoinet()")," \u7a7a\u5f02\u5e38 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/pulls/73"},"#PR73")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u5176\u4ed6\u66f4\u6539")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"\u65e0"))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u6587\u6863\u53d8\u5316")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u66f4\u65b0]"," \u5165\u95e8\u6587\u6863\u3001\u6570\u636e\u5e93\u4e0a\u4e0b\u6587\u6587\u6863\u3001\u591a\u6570\u636e\u5e93\u64cd\u4f5c\u6587\u6863")))),Object(b.b)("hr",null),Object(b.b)("h2",{id:"v102\uff08\u5df2\u53d1\u5e03\uff09"},"v1.0.2\uff08\u5df2\u53d1\u5e03\uff09"),Object(b.b)("ul",null,Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u65b0\u7279\u6027")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Pomelo.EntityFrameworkCore.MySql")," \u6700\u65b0 .NET 5 \u5305\u914d\u7f6e ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I24ZQK"},"#I24ZQK")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},".AddDateTimeJsonConverter(format)")," \u65f6\u95f4\u683c\u5f0f\u5e8f\u5217\u5316\u914d\u7f6e"),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"DateTime")," \u548c ",Object(b.b)("inlineCode",{parentName:"li"},"DateTimeOffset")," \u7c7b\u578b\u5e8f\u5217\u5316\u683c\u5f0f\u914d\u7f6e ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I253FI"},"#I253FI")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u7a81\u7834\u6027\u53d8\u5316")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u66f4\u65b0]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Mapster")," \u5305\u81f3 ",Object(b.b)("inlineCode",{parentName:"li"},"7.0.0")," \u7248"),Object(b.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," ",Object(b.b)("inlineCode",{parentName:"li"},"App.Services")," \u540d\u4e3a ",Object(b.b)("inlineCode",{parentName:"li"},"App.ServiceProvider")),Object(b.b)("li",{parentName:"ul"},"[\u79fb\u9664]"," ",Object(b.b)("inlineCode",{parentName:"li"},"App.ApplicationServices")," \u548c ",Object(b.b)("inlineCode",{parentName:"li"},"App.GetRequestService<>()")),Object(b.b)("li",{parentName:"ul"},"[\u79fb\u9664]"," \u975e Web \u4e3b\u673a\u6ce8\u5165\u62d3\u5c55"))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u95ee\u9898\u4fee\u590d")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"services.AddFriendlyException()")," \u7f3a\u5c11\u914d\u7f6e\u6ce8\u5165 bug"),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u6570\u636e\u5e93\u4e0a\u4e0b\u6587\u6c60\u88ab\u91ca\u653e\u548c\u9ad8\u5e76\u53d1\u4e0b\u5185\u5b58\u6ea2\u51fa bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2524K"},"#I2524K"),"\uff0c",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I24UMN"},"#I24UMN")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Sql\u4ee3\u7406")," \u8fd4\u56de\u7a7a\u6570\u636e\u65f6\u5f02\u5e38 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I24TCK"},"#I24TCK")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u5de5\u4f5c\u5355\u5143 ",Object(b.b)("inlineCode",{parentName:"li"},"[UnitOfWork]")," \u591a\u6570\u636e\u5e93\u88ab\u91ca\u653e bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I24Q6W"},"#I24Q6W")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u5176\u4ed6\u66f4\u6539")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," ",Object(b.b)("inlineCode",{parentName:"li"},"EntityBase")," \u548c ",Object(b.b)("inlineCode",{parentName:"li"},"Entity")," \u6240\u6709\u5c5e\u6027\u4e3a ",Object(b.b)("inlineCode",{parentName:"li"},"vitural")," \u4fee\u9970"),Object(b.b)("li",{parentName:"ul"},"[\u4f18\u5316]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Jwt")," \u8bfb\u53d6\u548c\u89e3\u6790\u6027\u80fd"),Object(b.b)("li",{parentName:"ul"},"[\u4f18\u5316]"," \u4f18\u5316\u4ee3\u7801\u652f\u6301 C# 9.0 \u6700\u65b0\u8bed\u6cd5"),Object(b.b)("li",{parentName:"ul"},"[\u4f18\u5316]"," ",Object(b.b)("inlineCode",{parentName:"li"},"MD5")," \u52a0\u5bc6\u6027\u80fd ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/pulls/71"},"#PR71")),Object(b.b)("li",{parentName:"ul"},"[\u79fb\u9664]"," \u65e0\u7528\u6216\u672a\u4f7f\u7528\u4ee3\u7801"))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u6587\u6863")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u66f4\u65b0]"," \u6570\u636e\u5e93\u4e0a\u4e0b\u6587\u3001\u591a\u6570\u636e\u5e93\u3001\u4e00\u5206\u949f\u5165\u95e8\u6587\u6863")))),Object(b.b)("hr",null),Object(b.b)("h2",{id:"v100\uff08\u5df2\u53d1\u5e03\uff09"},"v1.0.0\uff08\u5df2\u53d1\u5e03\uff09"),Object(b.b)("ul",null,Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u65b0\u7279\u6027")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u7f51\u7edc\u8bf7\u6c42 ",Object(b.b)("inlineCode",{parentName:"li"},"RemoteRequest")," \u7ec4\u4ef6 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I1YYWD"},"#I1YYWD")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},".AddInjectBase()")," \u6ce8\u5165\uff0c\u53ea\u5305\u542b\u57fa\u7840\u670d\u52a1\u6ce8\u5165"),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u6240\u6709\u670d\u52a1\u90fd\u652f\u6301 ",Object(b.b)("inlineCode",{parentName:"li"},"IServiceCollection")," \u548c ",Object(b.b)("inlineCode",{parentName:"li"},"IMvcBuilder")," \u6ce8\u5165"),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u629b\u5f02\u5e38\u72b6\u6001\u7801\u8bbe\u7f6e\u529f\u80fd ",Object(b.b)("inlineCode",{parentName:"li"},"StatusCode")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Swagger")," \u5e8f\u5217\u5316\u652f\u6301 ",Object(b.b)("inlineCode",{parentName:"li"},"Pascal")," \u5c5e\u6027\u547d\u540d\u65b9\u5f0f"))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u7a81\u7834\u6027\u53d8\u5316")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u66f4\u65b0]"," ",Object(b.b)("strong",{parentName:"li"},"\u6240\u6709\u7684\u5305\u4e3a ",Object(b.b)("inlineCode",{parentName:"strong"},".NET 5")," \u6b63\u5f0f\u7248")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u95ee\u9898\u4fee\u590d")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"SqlProxy")," \u4ee3\u7406\u5f02\u6b65\u5904\u7406 bug"),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u6570\u636e\u5e93\u7c7b\u578b ",Object(b.b)("inlineCode",{parentName:"li"},"Datetime")," \u8f6c ",Object(b.b)("inlineCode",{parentName:"li"},"DateTimeOffset")," bug"),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u5c5e\u6027\u9996\u5b57\u6bcd\u5927\u5c0f\u5199\u5e8f\u5217\u5316\u4e0d\u5339\u914d\u51fa\u73b0 ",Object(b.b)("inlineCode",{parentName:"li"},"null")," bug"),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u5bf9\u8c61\u5e8f\u5217\u5316\u4e2d\u6587\u51fa\u73b0\u4e71\u7801 bug"),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u9ed8\u8ba4\u5e8f\u5217\u5316\u914d\u7f6e\u65e0\u6548 bug"),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u6570\u636e\u5e93\u975e\u4f9d\u8d56\u6ce8\u5165\u65b9\u5f0f\u63d0\u4ea4\u65e0\u6548 bug"),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u5e94\u7528\u7a0b\u5e8f\u6c60\u63d0\u4ea4\u6240\u6709 ",Object(b.b)("inlineCode",{parentName:"li"},"DbContext")," \u7a7a\u5f02\u5e38 bug"),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Saas")," \u591a\u79df\u6237 ",Object(b.b)("inlineCode",{parentName:"li"},"Tenant")," \u7c7b\u578b\u5b57\u7b26\u4e32\u5c5e\u6027\u5728 ",Object(b.b)("inlineCode",{parentName:"li"},"MySql")," \u6570\u636e\u5e93\u4e0b\u51fa\u73b0 ",Object(b.b)("inlineCode",{parentName:"li"},"longtext")," \u7c7b\u578b bug"),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Mvc")," \u81ea\u52a8\u9a8c\u8bc1\u5b57\u7b26\u4e32\u7a7a\u503c bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I24M2T"},"#I24M2T")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u679a\u4e3e\u6ce8\u91ca\u88ab\u8986\u76d6 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I24N6J"},"#I24N6J")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u5ffd\u7565\u89c4\u8303\u5316\u7ed3\u679c\u65e0\u6548 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I24B8P"},"#I24B8P")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Swagger")," \u9ed8\u8ba4 ",Object(b.b)("inlineCode",{parentName:"li"},"ContentType")," \u4e0d\u662f ",Object(b.b)("inlineCode",{parentName:"li"},"applicaiton/json")," bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I24F3U"},"#I24F3U")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u5185\u7f6e ",Object(b.b)("inlineCode",{parentName:"li"},"System.Text.Json")," \u548c ",Object(b.b)("inlineCode",{parentName:"li"},"Newtonsoft.Json")," \u51b2\u7a81 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I24F3U"},"#I24F3U")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u5176\u4ed6\u66f4\u6539")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Fur")," \u6846\u67b6\u57df\u540d\u4e3a\uff1a",Object(b.b)("a",{parentName:"li",href:"https://furion.pro"},"https://furion.pro")),Object(b.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," \u4ed3\u50a8 ",Object(b.b)("inlineCode",{parentName:"li"},"FromSqlRaw")," \u548c ",Object(b.b)("inlineCode",{parentName:"li"},"FromSqlInterpolated")," \u63a5\u53e3\u4f4d\u7f6e"),Object(b.b)("li",{parentName:"ul"},"[\u4f18\u5316]"," \u6570\u636e\u52a0\u89e3\u5bc6\u6027\u80fd\uff0c",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/pulls/70"},"#PR70")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u6587\u6863")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u66f4\u65b0]"," README.md\u3001\u6846\u67b6\u4ecb\u7ecd\u3001\u6570\u636e\u5e93\u4e0a\u4e0b\u6587\u3001\u914d\u7f6e\u9009\u9879\u3001\u591a\u79df\u6237\u3001\u8de8\u57df\u6587\u6863")))))}o.isMDXComponent=!0},205:function(e,t,a){"use strict";a.d(t,"a",(function(){return m})),a.d(t,"b",(function(){return O}));var i=a(0),n=a.n(i);function b(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function r(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,i)}return a}function l(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var b=Object.getOwnPropertySymbols(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var p=n.a.createContext({}),o=function(e){var t=n.a.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},m=function(e){var t=o(e.components);return n.a.createElement(p.Provider,{value:t},e.children)},s={inlineCode:"code",wrapper:function(e){var t=e.children;return n.a.createElement(n.a.Fragment,{},t)}},u=n.a.forwardRef((function(e,t){var a=e.components,i=e.mdxType,b=e.originalType,r=e.parentName,p=c(e,["components","mdxType","originalType","parentName"]),m=o(a),u=i,O=m["".concat(r,".").concat(u)]||m[u]||s[u]||b;return a?n.a.createElement(O,l(l({ref:t},p),{},{components:a})):n.a.createElement(O,l({ref:t},p))}));function O(e,t){var a=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var b=a.length,r=new Array(b);r[0]=u;var l={};for(var c in t)hasOwnProperty.call(t,c)&&(l[c]=t[c]);l.originalType=e,l.mdxType="string"==typeof e?e:i,r[1]=l;for(var p=2;p")," \u6dfb\u52a0 ",Object(b.b)("inlineCode",{parentName:"li"},"Mvc")," \u8fc7\u6ee4\u5668\u62d3\u5c55 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I368BH"},"#I368BH")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u7a81\u7834\u6027\u53d8\u5316")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u5347\u7ea7]"," \u6846\u67b6\u4f9d\u8d56\u7684 .NET 5 SDK \u81f3\u6700\u65b0\u7248 5.0.3 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I37YQQ"},"#I37YQQ")),Object(b.b)("li",{parentName:"ul"},"[\u5347\u7ea7]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Swashbuckle.AspNetCore")," \u7ec4\u4ef6\u5305\u5230 ",Object(b.b)("inlineCode",{parentName:"li"},"6.0.x")," \u7248\u672c ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I37EZK"},"#I37EZK")),Object(b.b)("li",{parentName:"ul"},"[\u79fb\u9664]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Furion")," \u6846\u67b6 ",Object(b.b)("inlineCode",{parentName:"li"},"JWT")," \u62d3\u5c55\u7c7b\uff0c\u53ea\u5728 ",Object(b.b)("inlineCode",{parentName:"li"},"Furion.Extras.Authentication.JwtBearer")," \u4e2d\u4fdd\u7559 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I35D59"},"#I35D59")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u95ee\u9898\u4fee\u590d")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u4f20\u5165\u9519\u8bef ",Object(b.b)("inlineCode",{parentName:"li"},"JWT Token")," \u5b57\u7b26\u4e32\u5bfc\u81f4\u81ea\u52a8\u5237\u65b0 ",Object(b.b)("inlineCode",{parentName:"li"},"Token")," \u51fa\u73b0\u5b57\u7b26\u4e32\u8fb9\u754c\u503c\u5f02\u5e38 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I34ZE5"},"#I34ZE5")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u77ac\u65f6\u4f5c\u7528\u57df\u6570\u636e\u5e93\u4e0a\u4e0b\u6587\u4e5f\u4f1a\u81ea\u52a8\u52a0\u5165\u5de5\u4f5c\u5355\u5143\u5bfc\u81f4\u5199\u65e5\u5fd7\u65f6\u8fde\u9501\u5f02\u5e38 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I37WTV"},"#I37WTV")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u5176\u4ed6\u66f4\u6539")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u4f18\u5316]"," \u83b7\u53d6\u7cfb\u7edf\u73af\u5883\u53c2\u6570\u7684\u6027\u80fd ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I36SR5"},"#I36SR5")),Object(b.b)("li",{parentName:"ul"},"[\u4f18\u5316]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Furion")," \u5e95\u5c42\u6dfb\u52a0 ",Object(b.b)("inlineCode",{parentName:"li"},"Mvc")," \u8fc7\u6ee4\u5668\u4ee3\u7801 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I36SKA"},"#I36SKA")),Object(b.b)("li",{parentName:"ul"},"[\u4f18\u5316]"," \u6dfb\u52a0\u9ed8\u8ba4 ",Object(b.b)("inlineCode",{parentName:"li"},"Json")," \u5e8f\u5217\u5316\u65f6\u95f4\u9ed8\u8ba4\u65f6\u95f4\u683c\u5f0f ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I36SL0"},"#I36SL0")),Object(b.b)("li",{parentName:"ul"},"[\u5347\u7ea7]"," \u5347\u7ea7 ",Object(b.b)("inlineCode",{parentName:"li"},"SqlSugar")," \u62d3\u5c55\u5305\u5230 ",Object(b.b)("inlineCode",{parentName:"li"},"5.0.2.6")," \u7248\u672c ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I36SIG"},"#I36SIG")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u6587\u6863\u53d8\u5316")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u6570\u636e\u5e93\u5165\u95e8\u6587\u6863 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I37Z8S"},"#I37Z8S")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u66f4\u65b0\u65e5\u5fd7\u6587\u6863 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I36PI0"},"#I36PI0")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u8bf7\u6c42\u5ba1\u8ba1\u65e5\u5fd7\u3001\u6267\u884c ",Object(b.b)("inlineCode",{parentName:"li"},"Sql")," \u66f4\u65b0\u65e5\u5fd7\u6587\u6863 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I36PIK"},"#I36PIK")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u524d\u7aef\u4f7f\u7528 ",Object(b.b)("inlineCode",{parentName:"li"},"axios")," \u8de8\u57df\u914d\u7f6e\u6587\u6863 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I36PIT"},"#I36PIT")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"App")," \u9759\u6001\u7c7b\u83b7\u53d6\u5e94\u7528\u3001\u73af\u5883\u66f4\u591a\u4fe1\u606f\u6570\u636e ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I36SOV"},"#I36SOV")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u82f1\u6587\u7248 ",Object(b.b)("inlineCode",{parentName:"li"},"README.md")," \u4ecb\u7ecd ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I37QHP"},"#I37QHP")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u95ee\u7b54\u7b54\u7591"))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u4e0d\u505a\u5b9e\u73b0")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u591a\u8bed\u8a00\u8d44\u6e90\u6587\u4ef6\u81ea\u52a8\u521b\u5efa ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I35AA4"},"#I35AA4")),Object(b.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u5efa\u8bae\u591a\u8bed\u8a00\u52a0\u4e0a\u7ef4\u543e\u5c14\u8bed\u652f\u6301 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I37X1L"},"#I37X1L"))))),Object(b.b)("hr",null),Object(b.b)("h2",{id:"v1130\uff08\u5df2\u53d1\u5e03\uff09"},"v1.13.0\uff08\u5df2\u53d1\u5e03\uff09"),Object(b.b)("ul",null,Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u65b0\u7279\u6027")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u591a\u8bed\u8a00\u529f\u80fd\u53ca\u62d3\u5c55 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2DOCL"},"#I2DOCL")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u4e8b\u4ef6\u603b\u7ebf\u529f\u80fd\u53ca\u6d88\u606f\u4e2d\u5fc3 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I23BKN"},"#I23BKN")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Swagger")," \u5206\u7ec4\u663e\u793a\u9690\u85cf\u914d\u7f6e ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2AHH8"},"#I2AHH8")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Furion.Extras.Logging.Serilog")," \u62d3\u5c55\u63d2\u4ef6 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2AAN8"},"#I2AAN8")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"cli.ps")," \u652f\u6301 ",Object(b.b)("inlineCode",{parentName:"li"},"-Namespace")," \u547d\u540d\u7a7a\u95f4\u6307\u5b9a ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2A175"},"#I2A175")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Swagger")," \u89c4\u8303\u5316\u5316\u6587\u6863\u6388\u6743\u5931\u6548\u540e\u81ea\u52a8\u53d6\u6d88\u6388\u6743\u9501 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2AIWC"},"#I2AIWC")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Request.Body")," \u652f\u6301\u91cd\u590d\u8bfb\u529f\u80fd\uff0c\u4e3b\u8981\u89e3\u51b3\u5fae\u4fe1 SDK \u95ee\u9898 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2AMG0"},"#I2AMG0")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u7f51\u7edc\u8bf7\u6c42\u529f\u80fd\u53ca\u6587\u6863 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2APGJ"},"#I2APGJ")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"SqlSugar")," \u62d3\u5c55\u5305\u652f\u6301\u6253\u5370 ",Object(b.b)("inlineCode",{parentName:"li"},"sql")," \u5230 ",Object(b.b)("inlineCode",{parentName:"li"},"MiniProfiler")," \u4e2d ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2ASLS"},"#I2ASLS")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Furion.Extras.DatabaseAccesssor.Dapper")," \u62d3\u5c55\u63d2\u4ef6 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2ASYA"},"#I2ASYA")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Furion.Extras.DatabaseAccessor.PetaPoco")," \u62d3\u5c55\u63d2\u4ef6 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2AUGA"},"#I2AUGA")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u7f51\u7edc\u8bf7\u6c42\u5b57\u7b26\u4e32\u62d3\u5c55\u65b9\u6cd5 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2CPQ0"},"#I2CPQ0")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"SqlSugar")," \u62d3\u5c55\u65b0\u589e ",Object(b.b)("inlineCode",{parentName:"li"},"PagedList")," \u62d3\u5c55 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2CW99"},"#I2CW99")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u8fdc\u7a0b\u8bf7\u6c42\u652f\u6301\u53c2\u6570\u7279\u6027\u9a8c\u8bc1 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2CX5L"},"#I2CX5L")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"App.User")," \u83b7\u53d6\u5f53\u524d\u6388\u6743\u7528\u6237\u4fe1\u606f\u4fbf\u6377\u65b9\u6cd5 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2CZLO"},"#I2CZLO")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u89c4\u8303\u5316\u6587\u6863\u53ef\u914d\u7f6e\u529f\u80fd\uff0c\u652f\u6301 ",Object(b.b)("inlineCode",{parentName:"li"},"appsettings.json")," \u914d\u7f6e ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2D1K9"},"#I2D1K9")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u8fdc\u7a0b\u8bf7\u6c42\u62e6\u622a\u5668\u6dfb\u52a0\u65b9\u6cd5\u548c\u65b9\u6cd5\u53c2\u6570 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2D2CM"},"#I2D2CM")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u8fdc\u7a0b\u8bf7\u6c42\u51fa\u9519\u8fd4\u56de\u9ed8\u8ba4\u503c\u652f\u6301 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2D44M"},"#I2D44M")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u8fdc\u7a0b\u8bf7\u6c42 ",Object(b.b)("inlineCode",{parentName:"li"},"body")," \u53c2\u6570\u5e8f\u5217\u5316\u652f\u6301\u8bbe\u7f6e ",Object(b.b)("inlineCode",{parentName:"li"},"PropertyNamingPolicy")," ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2D685"},"#I2D685")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u8fdc\u7a0b\u670d\u52a1\u63a5\u53e3\u5ba2\u6237\u7aef\u914d\u7f6e ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2D7PS"},"#I2D7PS")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"AddInject")," \u548c ",Object(b.b)("inlineCode",{parentName:"li"},"UseInject")," \u5141\u8bb8\u81ea\u5b9a\u4e49 ",Object(b.b)("inlineCode",{parentName:"li"},"SecurityDefinitions")," \u548c ",Object(b.b)("inlineCode",{parentName:"li"},"SwaggerUI")," ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2DIMG"},"#I2DIMG")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"[SecurityDefine]")," \u9ed8\u8ba4\u6784\u9020\u51fd\u6570 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2DNXT"},"#I2DNXT")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"AspectDispatchProxy")," \u52a8\u6001\u4ee3\u7406\u7c7b ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2DO6I"},"#I2DO6I")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"[QueryParameters]")," \u7279\u6027\uff0c\u652f\u6301\u4e00\u952e\u5c06 ",Object(b.b)("inlineCode",{parentName:"li"},"Action")," \u53c2\u6570\u6dfb\u52a0 ",Object(b.b)("inlineCode",{parentName:"li"},"[FromQuery]")," \u7279\u6027 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2G8TF"},"#I2G8TF")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u52a8\u6001\u65e5\u5fd7\u914d\u7f6e\u53ca\u62d3\u5c55\u65b9\u6cd5 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2GDGD"},"#I2GDGD")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"WebApi")," \u8bf7\u6c42\u8c13\u8bcd\u9ed8\u8ba4\u89c4\u5219\u914d\u7f6e\u529f\u80fd ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2M70X"},"#I2M70X")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u7a81\u7834\u6027\u53d8\u5316")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u5347\u7ea7]"," ",Object(b.b)("inlineCode",{parentName:"li"},".NET 5")," SDK \u5230 ",Object(b.b)("inlineCode",{parentName:"li"},".NET 5.0.2")," \u7248\u672c ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2D0PZ"},"#I2D0PZ")),Object(b.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," \u6846\u67b6\u5185\u6240\u6709\u62d3\u5c55\u7c7b\u547d\u540d\u7a7a\u95f4\uff0c\u5168\u90e8\u8fc1\u79fb\u5230 ",Object(b.b)("inlineCode",{parentName:"li"},"Furion.\u6a21\u5757.Extensions")," \u4e0b ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2AH54"},"#I2AH54")),Object(b.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Swagger")," \u8bb0\u4f4f\u6388\u6743\u5b58\u50a8\u65b9\u5f0f\uff0c\u66ff\u6362 ",Object(b.b)("inlineCode",{parentName:"li"},"Session")," \u5b58\u50a8\u65b9\u5f0f\u4e3a ",Object(b.b)("inlineCode",{parentName:"li"},"LocalStorage")," \u65b9\u5f0f ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2AKUA"},"#I2AKUA")),Object(b.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Furion")," \u6846\u67b6\u5305\u63cf\u8ff0\u6587\u4ef6\uff0c\u51cf\u5c11\u6846\u67b6\u4f53\u79ef ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2APAU"},"#I2APAU")),Object(b.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," ",Object(b.b)("inlineCode",{parentName:"li"},"App.CanBeScanTypes")," \u4e3a ",Object(b.b)("inlineCode",{parentName:"li"},"App.EffectiveTypes")," ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2B0ZR"},"#I2B0ZR")),Object(b.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," ",Object(b.b)("inlineCode",{parentName:"li"},"App.ServiceProvider")," \u5c5e\u6027\u5e76\u79fb\u9664 ",Object(b.b)("inlineCode",{parentName:"li"},"App.GetDuplicateXXX")," \u65b9\u6cd5 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2CYZE"},"#I2CYZE")),Object(b.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Db.GetDuplicateDbContext")," \u4e3a ",Object(b.b)("inlineCode",{parentName:"li"},"Db.GetNewDbContext")," ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2CZ04"},"#I2CZ04")),Object(b.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Db.GetSqlDispatchProxy")," \u4e3a ",Object(b.b)("inlineCode",{parentName:"li"},"Db.GetSqlProxy")," ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2DO9T"},"#I2DO9T")),Object(b.b)("li",{parentName:"ul"},"[\u91cd\u6784]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Aop")," \u670d\u52a1\u62e6\u622a\u5668\uff0c\u652f\u6301\u5f02\u6b65\u3001\u540c\u6b65\u4e24\u79cd\u65b9\u5f0f ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2B9HQ"},"#I2B9HQ")),Object(b.b)("li",{parentName:"ul"},"[\u91cd\u6784]"," \u7f51\u7edc\u8bf7\u6c42\u6240\u6709\u529f\u80fd ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2BMR7"},"#I2BMR7")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u95ee\u9898\u4fee\u590d")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Swagger")," \u89c4\u8303\u5316\u5316\u7ed3\u679c\u4e0d\u4e00\u81f4 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2ACF3"},"#I2ACF3")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u6570\u636e\u5e93\u65b0\u589e\u6216\u66f4\u65b0\u5ffd\u7565\u7a7a\u503c\u64cd\u4f5c\u65b9\u6cd5\u62a5\u7a7a\u5f02\u5e38 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2AB6C"},"#I2AB6C")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Startup.cs")," Aop \u5168\u5c40\u62e6\u622a\u65e0\u6548 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2A7T2"},"#I2A7T2")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Token")," \u8fc7\u671f\u540e\u81ea\u52a8\u5237\u65b0 ",Object(b.b)("inlineCode",{parentName:"li"},"Token")," \u65e0\u6cd5\u83b7\u53d6\u6700\u65b0\u7684\u7528\u6237\u4fe1\u606f bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2AWQI"},"#I2AWQI")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},'[ApiDescriptionSettings(Tag="xx")]')," \u5bfc\u81f4 ",Object(b.b)("inlineCode",{parentName:"li"},"swagger.json")," \u62a5\u9519 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2B47R"},"#I2B47R")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Mysql")," sql \u6570\u636e\u5e93\u67e5\u8be2\u7ed3\u679c ",Object(b.b)("inlineCode",{parentName:"li"},"tinyint")," \u7c7b\u578b\u8f6c\u6362\u51fa\u9519 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2BEBM"},"#I2BEBM")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u89c4\u8303\u5316\u7ed3\u679c\u591a\u6b21\u5305\u88f9\u7c7b\u578b bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2BHHZ"},"#I2BHHZ")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u52a8\u6001 Api \u57fa\u5143\u7c7b\u578b\u6570\u7ec4\u95ee\u9898 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2BMS5"},"#I2BMS5")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"sql")," \u67e5\u8be2\u679a\u4e3e\u7c7b\u578b\u8f6c\u6362\u5f02\u5e38 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2BS2Y"},"#I2BS2Y")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"string.SqlQuerizeAsync()")," \u62d3\u5c55\u8fd4\u56de\u9519\u8bef bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2BSTS"},"#I2BSTS")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u52a8\u6001 Api \u5b50\u7c7b\u91cd\u5199\u7236\u7c7b\u65b9\u6cd5\u5e76\u53d6\u522b\u540d\u540e ",Object(b.b)("inlineCode",{parentName:"li"},"Swagger")," \u5f02\u5e38 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2C9VP"},"#I2C9VP")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u7f51\u7edc\u8bf7\u6c42 ",Object(b.b)("inlineCode",{parentName:"li"},"application/json")," \u5e8f\u5217\u5316\u5927\u5c0f\u5199\u95ee\u9898 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2CRJC"},"#I2CRJC")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u591a\u6570\u636e\u5e93\u5b9a\u4f4d\u5668\u5b9e\u4f53\u5d4c\u5957\u5173\u8054 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2CVN0"},"#I2CVN0")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u8de8\u57df\u54cd\u5e94\u5934\u8bbe\u7f6e\u65e0\u6548 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2CW5T"},"#I2CW5T")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u8fdc\u7a0b\u7f51\u7edc\u8bf7\u6c42\u4ee3\u7406\u6253\u5370\u5230 ",Object(b.b)("inlineCode",{parentName:"li"},"MiniProfiler")," bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2CZBC"},"#I2CZBC")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u8fdc\u7a0b\u8bf7\u6c42\u54cd\u5e94\u62e6\u622a\u5668 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2D4DG"},"#I2D4DG")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"SqlSugar")," \u6846\u67b6 ",Object(b.b)("inlineCode",{parentName:"li"},"AsQueryable()")," \u4e00\u76f4\u8ffd\u52a0\u53c2\u6570 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2DH1D"},"#I2DH1D")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u81ea\u52a8\u5237\u65b0 ",Object(b.b)("inlineCode",{parentName:"li"},"Token")," \u7a7a\u5f02\u5e38 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2DO29"},"#I2DO29")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u751f\u6210 ",Object(b.b)("inlineCode",{parentName:"li"},"JWT Token")," \u4e0d\u4f20\u8fc7\u671f\u65f6\u95f4\u51fa\u73b0\u9a8c\u8bc1 401 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2DO8L"},"#I2DO8L")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"AppStartup")," \u6392\u5e8f\u65e0\u6548 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2DVD2"},"#I2DVD2")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u672a\u542f\u7528\u591a\u8bed\u8a00\u670d\u52a1\u65f6\u53cb\u597d\u5f02\u5e38\u548c\u9a8c\u8bc1\u51fa\u73b0\u7a7a\u5f02\u5e38 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2ECUJ"},"#I2ECUJ")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u6570\u636e\u6821\u9a8c\u5b57\u6bcd\u548c\u6570\u5b57\u7ec4\u5408\u65e0\u6cd5\u5339\u914d bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2EF2Q"},"#I2EF2Q")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u6570\u636e\u6821\u9a8c\u624b\u673a\u6216\u56fa\u8bdd\u65e0\u6548 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2M5IZ"},"#I2M5IZ")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Dapper")," \u62d3\u5c55\u89e3\u6790 ",Object(b.b)("inlineCode",{parentName:"li"},"SqlConnection")," \u5f02\u5e38 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2M5P2"},"#I2M5P2")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u5f00\u542f\u591a\u8bed\u8a00\u540e\uff0c",Object(b.b)("inlineCode",{parentName:"li"},"EF")," \u8fc1\u79fb\u5f02\u5e38 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2M7DT"},"#I2M7DT")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"IEntityTypeBuilder")," \u4e0d\u652f\u6301\u591a\u91cd\u7ee7\u627f bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2PAOD"},"#I2PAOD")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"JwtHandler")," \u8bbe\u7f6e\u81ea\u52a8\u5237\u65b0\u540e\uff0c\u533f\u540d\u8bbf\u95ee\u65e0\u6cd5\u901a\u8fc7 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2SDOX"},"#I2SDOX")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Dapper")," \u62d3\u5c55\u4e2d ",Object(b.b)("inlineCode",{parentName:"li"},"SqlServer")," \u6570\u636e\u5e93\u83b7\u53d6\u8fde\u63a5\u5bf9\u8c61\u7c7b\u578b bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/pulls/159"},"#PR159")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u5176\u4ed6\u66f4\u6539")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u4f18\u5316]"," \u79fb\u9664 ",Object(b.b)("inlineCode",{parentName:"li"},"Sql")," \u67e5\u8be2\u7ed3\u679c\u6620\u5c04\u68c0\u67e5 ",Object(b.b)("inlineCode",{parentName:"li"},"[NotMapper]")," \u7279\u6027\u673a\u5236 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I34XD0"},"#I34XD0")),Object(b.b)("li",{parentName:"ul"},"[\u4f18\u5316]"," \u4f9d\u8d56\u6ce8\u5165\u65f6\u6392\u9664 ",Object(b.b)("inlineCode",{parentName:"li"},"IDynamicApiController")," \u63a5\u53e3 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2ECTG"},"#I2ECTG")),Object(b.b)("li",{parentName:"ul"},"[\u4f18\u5316]"," ",Object(b.b)("inlineCode",{parentName:"li"},"MD5")," \u52a0\u5bc6\u6027\u80fd ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/pulls/158"},"#PR158")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u6587\u6863\u53d8\u5316")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u91cd\u6784]"," \u6587\u6863\u9996\u9875 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I34XBR"},"#I34XBR")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u7f51\u7edc\u8bf7\u6c42\u6587\u6863 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2APGJ"},"#I2APGJ")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u591a\u8bed\u8a00\u6587\u6863 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2DOCL"},"#I2DOCL")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u6587\u6863\u5168\u6587\u641c\u7d22\u5f15\u64ce ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I34XAW"},"#I34XAW")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u5168\u5c40\u9759\u6001\u7c7b\u7c7b\u578b ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I34XB4"},"#I34XB4")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u6846\u67b6\u53ef\u914d\u7f6e\u9009\u9879\u6587\u6863 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I34XB9"},"#I34XB9")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u4e8b\u4ef6\u603b\u7ebf\u6587\u6863 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I34XBI"},"#I34XBI")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u6570\u636e\u52a0\u89e3\u5bc6\u6587\u6863 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I34XC0"},"#I34XC0")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u8d21\u732e\u6307\u5357\u6587\u6863 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I34XC8"},"#I34XC8")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"HttpContext")," \u53ca ",Object(b.b)("inlineCode",{parentName:"li"},"\u6587\u4ef6\u4e0a\u4f20\u4e0b\u8f7d")," \u535a\u5ba2\u6587\u7ae0 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I34XCB"},"#I34XCB")),Object(b.b)("li",{parentName:"ul"},"[\u5176\u4ed6]"," \u6587\u6863\u5c0f\u8c03\u6574\uff0c\u5c0f\u4f18\u5316"))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u95ee\u7b54\u7b54\u7591")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u8de8\u57df\u8bbe\u7f6e\u65e0\u6548 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2ASNJ"},"#I2ASNJ")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(b.b)("inlineCode",{parentName:"li"},"MVC")," \u89c6\u56fe\u65e0\u6548\uff0c\u539f\u56e0\u662f ",Object(b.b)("inlineCode",{parentName:"li"},".cshtml")," \u6587\u4ef6\u6ca1\u6709\u8bbe\u7f6e\u4e3a ",Object(b.b)("inlineCode",{parentName:"li"},"\u5185\u5bb9")," ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2AXUU"},"#I2AXUU")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Sql")," \u64cd\u4f5c\u53ef\u4ee5\u5b9e\u73b0\u4e8b\u52a1\u5417\uff1f",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2B0NX"},"#I2B0NX")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(b.b)("inlineCode",{parentName:"li"},"IRepository")," \u64cd\u4f5c\u6570\u636e\u5e93\u4f1a\u6253\u5f00\u591a\u6b21\u6570\u636e\u5e93\u8fde\u63a5 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2BB7B"},"#I2BB7B")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u5982\u4f55\u8fdb\u5165\u81ea\u5b9a\u4e49 ",Object(b.b)("inlineCode",{parentName:"li"},"AppAuthorizeHandler")," \u65ad\u70b9 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2BGXY"},"#I2BGXY")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(b.b)("inlineCode",{parentName:"li"},"SqlSugar")," \u6ce8\u5165\u95ee\u9898 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2C2AQ"},"#I2C2AQ")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u5efa\u8bae\u589e\u52a0 API \u7b7e\u540d\u9a8c\u8bc1\uff0c\u65f6\u6548\u9a8c\u8bc1 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2C6ET"},"#I2C6ET")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u591a\u6570\u636e\u5e93\u591a\u79df\u6237\u540c\u65f6\u4f7f\u7528 ",Object(b.b)("inlineCode",{parentName:"li"},"Add-Migration")," \u62a5\u9519 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2CEHS"},"#I2CEHS")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(b.b)("inlineCode",{parentName:"li"},"ISqlSugarRepository")," \u6ca1\u6709 ",Object(b.b)("inlineCode",{parentName:"li"},"Getxxx")," \u65b9\u6cd5 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2CJLZ"},"#I2CJLZ")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(b.b)("inlineCode",{parentName:"li"},"cli.ps1")," \u5982\u4f55\u5c06 ",Object(b.b)("inlineCode",{parentName:"li"},"sql")," \u91cc\u7684\u8868\u5bfc\u51fa\u6210 ",Object(b.b)("inlineCode",{parentName:"li"},"model")," \u7c7b ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2CSUL"},"#I2CSUL")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u624b\u52a8\u4fee\u6539 ",Object(b.b)("inlineCode",{parentName:"li"},"Swagger")," \u7ec8\u7ed3\u70b9\u8def\u5f84\u65e0\u6548 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2D608"},"#I2D608")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(b.b)("inlineCode",{parentName:"li"},"DefaultDbContext")," \u4e0d\u80fd\u8bc6\u522b ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2DCZX"},"#I2DCZX")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u5404\u5206\u5c42\u9879\u76ee ",Object(b.b)("inlineCode",{parentName:"li"},"Startup.cs")," \u652f\u6301 ",Object(b.b)("inlineCode",{parentName:"li"},"Configuration")," ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2DDUP"},"#I2DDUP")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Aop")," \u65e0\u6cd5\u62e6\u622a\uff0c\u65e0\u6548 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2DEY8"},"#I2DEY8")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(b.b)("inlineCode",{parentName:"li"},"mysql")," \u6267\u884c ",Object(b.b)("inlineCode",{parentName:"li"},"Add-Migration")," \u62a5\u9519 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2DSB8"},"#I2DSB8"),"\\"),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Entity")," \u521b\u5efa\u65f6\u95f4\u548c\u662f\u5426\u5220\u9664\u6dfb\u52a0\u9ed8\u8ba4\u503c ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2E04H"},"#I2E04H")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(b.b)("inlineCode",{parentName:"li"},"swagger")," \u4e2d\u591a\u4e2a ",Object(b.b)("inlineCode",{parentName:"li"},"servers")," \u8bbe\u7f6e ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2E0IF"},"#I2E0IF")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u5168\u5c40\u7b5b\u9009\u5668 \u6ca1\u6709\u6267\u884c ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2E5R4"},"#I2E5R4")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u591a\u6570\u636e\u5e93\u5b9a\u4f4d\u5668\u7591\u95ee ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2E77T"},"#I2E77T")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(b.b)("inlineCode",{parentName:"li"},"cli.ps")," \u9006\u5411\u5de5\u7a0b ",Object(b.b)("inlineCode",{parentName:"li"},"Mysql")," \u6570\u636e\u5e93\u62a5\u9519 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2E7I5"},"#I2E7I5")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Swagger")," \u5f00\u53d1\u73af\u5883 ",Object(b.b)("inlineCode",{parentName:"li"},"applicationsettings.json")," \u4e2d\u6587\u4e71\u7801 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2EAG1"},"#I2EAG1")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u589e\u52a0\u6307\u5b9a\u8def\u5f84\u7a0b\u5e8f\u96c6\u6620\u5c04 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2EEO2"},"#I2EEO2")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u52a8\u6001\u7f16\u8bd1 ",Object(b.b)("inlineCode",{parentName:"li"},"cs")," \u811a\u672c\u6587\u4ef6 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2EH66"},"#I2EH66")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u81ea\u5b9a\u4e49\u4e2d\u95f4\u4ef6\uff0c\u8fd4\u56de\u7684\u9519\u8bef\u6ca1\u6709\u89c4\u8303\u5316\u7ed3\u679c ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2NV8S"},"#I2NV8S")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Swagger")," \u5faa\u73af\u5f15\u7528\u8bbe\u7f6e\u751f\u6210\u6587\u6863\u5c42\u7ea7\u65e0\u6548 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2PLQQ"},"#I2PLQQ")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u914d\u7f6e\u6587\u4ef6\u652f\u6301 ",Object(b.b)("inlineCode",{parentName:"li"},"yaml")," \u6587\u4ef6\u5417? ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2TJ3N"},"#I2TJ3N")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u4fee\u6539\u6570\u636e\u5e93\u672a ",Object(b.b)("inlineCode",{parentName:"li"},"mysql")," \u6267\u884c ",Object(b.b)("inlineCode",{parentName:"li"},"Add-Migration")," \u62a5\u9519 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2VR64"},"#I2VR64")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u591a\u6570\u636e\u5e93\u4f7f\u7528\u5b9a\u4f4d\u5668\u65f6\u62a5\u9519 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2VR8F"},"#I2VR8F")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Migration To Oracle")," \u5f02\u5e38 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2WBYQ"},"#I2WBYQ")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u5f00\u53d1\u65f6\u663e\u793a ",Object(b.b)("inlineCode",{parentName:"li"},"Swagger"),"\uff0c\u4e0a\u7ebf\u65f6\u5173\u95ed ",Object(b.b)("inlineCode",{parentName:"li"},"Swagger"),"\uff0c\u8fd9\u9700\u8981\u600e\u4e48\u914d\u7f6e ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2WOYV"},"#I2WOYV")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u517c\u5bb9 Mvc \u590d\u6742\u9a8c\u8bc1\u6ca1\u6709\u8bd5\u9a8c\u6210\u529f ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2X3GV"},"#I2X3GV")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Aop")," \u80fd\u4e0d\u80fd\u652f\u6301\u65e0\u63a5\u53e3\u7684\u7c7b ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2X8AS"},"#I2X8AS")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u5173\u4e8e ",Object(b.b)("inlineCode",{parentName:"li"},"JWT Token")," \u81ea\u52a8\u5237\u65b0\u95ee\u9898 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2YD4K"},"#I2YD4K")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u80fd\u5426\u589e\u52a0\u4e00\u4e2a\u62d3\u5c55\u7684 ",Object(b.b)("inlineCode",{parentName:"li"},"Entity"),"\uff0c\u589e\u52a0\u4e00\u4e9b\u62d3\u5c55\u7684\u5c5e\u6027 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2YDKT"},"#I2YDKT")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Furion")," \u65e0\u6cd5\u8fd8\u539f\u5305\uff0c\u4f7f\u7528",Object(b.b)("inlineCode",{parentName:"li"},"Nuget")," \u4e0b\u8f7d\u548c\u901a\u8fc7\u6700\u65b0\u7684\u7684\u811a\u624b\u67b6\u4e0b\u8f7d\u90fd\u63d0\u793a\u8fd9\u4e2a\u95ee\u9898 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I30446"},"#I30446")),Object(b.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u590d\u6742\u6821\u9a8c\u4e0e\u7279\u6027\u9a8c\u8bc1\u4e0d\u80fd\u5e76\u884c ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I3046U"},"#I3046U")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u4e0d\u505a\u5b9e\u73b0")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u5f15\u5165 Webhook \u673a\u5236 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2A3I0"},"#I2A3I0")),Object(b.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u589e\u52a0 blog \u5b58\u50a8\u670d\u52a1 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2AMBP"},"#I2AMBP")),Object(b.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," Blazor Server \u73af\u5883\u4e0b EF \u7684 DbContext \u591a\u7ebf\u7a0b\u95ee\u9898 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2AMD2"},"#I2AMD2")),Object(b.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u5e0c\u671b\u5b9e\u73b0\u5de5\u4f5c\u5355\u5143\u64cd\u4f5c\u63a5\u53e3\uff08IUnitOfWork\uff09",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2AOR5"},"#I2AOR5")),Object(b.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u5efa\u8bae\u65b0\u589e ",Object(b.b)("inlineCode",{parentName:"li"},"string.ToPagedListAsync()")," \u64cd\u4f5c ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2BZ3Z"},"#I2BZ3Z")),Object(b.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u5efa\u8bae\u65b0\u589e ",Object(b.b)("inlineCode",{parentName:"li"},"GraphQL"),"\uff0c",Object(b.b)("inlineCode",{parentName:"li"},"OData")," \u529f\u80fd ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2C9EH"},"#I2C9EH")),Object(b.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u8feb\u5207\u671f\u671b\u652f\u6301 CAP \u5206\u5e03\u5f0f\u4e8b\u52a1 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2CBRF"},"#I2CBRF")),Object(b.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u5982\u4f55\u8ba9\u67d0\u4e2a\u65b9\u6cd5\u6216\u5b9e\u4f53\u53d8\u5316\u540e\uff0c\u4e0d\u88ab ",Object(b.b)("inlineCode",{parentName:"li"},"SavingChangesEvent")," \u7b49\u62e6\u622a ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2CEM9"},"#I2CEM9")),Object(b.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u5efa\u8bae\u65e5\u5fd7\u5c01\u88c5\u589e\u52a0\u66f4\u591a\u62d3\u5c55\uff0c\u6bd4\u5982\uff1a\u81ea\u5b9a\u4e49\u4fdd\u5b58\u65e5\u5fd7\u6587\u4ef6 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2CW8V"},"#I2CW8V")),Object(b.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u5bf9 ",Object(b.b)("inlineCode",{parentName:"li"},"SqlSugar")," \u7684\u652f\u6301\uff0c\u589e\u52a0 ",Object(b.b)("inlineCode",{parentName:"li"},"Nuget")," \u811a\u624b\u67b6 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2D91U"},"#I2D91U")),Object(b.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u4f7f\u7528 ",Object(b.b)("inlineCode",{parentName:"li"},"Middleware")," \u5b9e\u73b0\u53cd\u5411\u4ee3\u7406 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2DKM1"},"#I2DKM1")),Object(b.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u652f\u6301\u914d\u7f6e\u591a\u4e2a ",Object(b.b)("inlineCode",{parentName:"li"},"Aop")," \u529f\u80fd ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2E6Z2"},"#I2E6Z2")),Object(b.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u662f\u5426\u8ba1\u5212\u5f00\u53d1\u7c7b\u4f3c\u7f51\u5173\u7684\u529f\u80fd ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2PD1L"},"#I2PD1L")),Object(b.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," ",Object(b.b)("inlineCode",{parentName:"li"},"waring CS8002"),": \u5f15\u7528\u7a0b\u5e8f\u96c6 ",Object(b.b)("inlineCode",{parentName:"li"},"Furion")," \u6ca1\u6709\u5f3a\u540d\u79f0 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2WDN2"},"#I2WDN2")),Object(b.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," Oracle \u6570\u636e\u5e93\u9a71\u52a8\u96c6\u6210 ",Object(b.b)("inlineCode",{parentName:"li"},"Devart.Data.Oracle.Entity.EFCore")," ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2XJIU"},"#I2XJIU"))))),Object(b.b)("hr",null),Object(b.b)("h2",{id:"v170\uff08\u5df2\u53d1\u5e03\uff09"},"v1.7.0\uff08\u5df2\u53d1\u5e03\uff09"),Object(b.b)("ul",null,Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u65b0\u7279\u6027")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Furion.Extras.ObjectMapper.Mapster")," \u62d3\u5c55\u5305 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29LSJ"},"#I29LSJ")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Furion.Extras.Logging.Serilog")," \u62d3\u5c55\u5305 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2AAN8"},"#I2AAN8")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Furion.Extras.Web.HttpContext")," \u62d3\u5c55\u5305 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29LSM"},"#I29LSM")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u5185\u7f6e ",Object(b.b)("inlineCode",{parentName:"li"},"Token")," \u5237\u65b0\u673a\u5236\u652f\u6301 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29K57"},"#I29K57")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u52a8\u6001\u6570\u636e\u5e93\u4e0a\u4e0b\u6587\uff0c\u652f\u6301\u8fd0\u884c\u65f6\u6267\u884c ",Object(b.b)("inlineCode",{parentName:"li"},"OnModelCreating")," ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I28UDT"},"#I28UDT")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u652f\u6301\u4f9d\u8d56\u6ce8\u5165\u6392\u9664\u6307\u5b9a\u63a5\u53e3 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29693"},"#I29693")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u89c4\u8303\u5316\u7ed3\u679c\u8fd4\u56de\u65f6\u95f4\u6233\u5b57\u6bb5 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29697"},"#I29697")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u57fa\u7840 ",Object(b.b)("inlineCode",{parentName:"li"},"CURD")," \u7236\u7c7b\u64cd\u4f5c\u4f8b\u5b50 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I296SR"},"#I296SR")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},'sql.Change("\u5b9a\u4f4d\u5668\u5b8c\u6574\u7c7b\u578b\u540d\u79f0")')," \u652f\u6301 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29LAB"},"#I29LAB")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"UpdateInclude")," \u548c ",Object(b.b)("inlineCode",{parentName:"li"},"UpdateExclude")," \u5ffd\u7565\u7a7a\u53c2\u6570\u652f\u6301 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29VUG"},"#I29VUG")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u6570\u636e\u5e93\u4e0a\u4e0b\u6587\u5185\u7f6e\u5047\u5220\u9664\u67e5\u8be2\u8fc7\u6ee4\u5668\u652f\u6301 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29Y2R"},"#I29Y2R")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u5ffd\u7565\u7a7a\u503c\u6392\u9664\u9ed8\u8ba4\u65f6\u95f4\u683c\u5f0f ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29VUV"},"#I29VUV")),Object(b.b)("li",{parentName:"ul"},"[\u5347\u7ea7]"," ",Object(b.b)("inlineCode",{parentName:"li"},"MiniProfiler")," \u7ec4\u4ef6 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I297R9"},"#I297R9")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u7a81\u7834\u6027\u53d8\u5316")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," ",Object(b.b)("inlineCode",{parentName:"li"},"AppAuthorizeHandler")," \u6388\u6743\u7ba1\u9053\u4e3a\u5f02\u6b65\u5904\u7406 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29MD9"},"#I29MD9")),Object(b.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Swagger")," \u9ed8\u8ba4\u542f\u7528 ",Object(b.b)("inlineCode",{parentName:"li"},"JWT")," \u6388\u6743\u652f\u6301 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29LI4"},"#I29LI4")),Object(b.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," ",Object(b.b)("inlineCode",{parentName:"li"},"HttpContextUtilities")," \u540d\u79f0\u6539\u4e3a ",Object(b.b)("inlineCode",{parentName:"li"},"HttpContextLocal")," ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29KQE"},"#I29KQE")),Object(b.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," ",Object(b.b)("inlineCode",{parentName:"li"},"UnifyResultContext")," \u540d\u79f0\u6539\u4e3a ",Object(b.b)("inlineCode",{parentName:"li"},"UnifyContext")," ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29LLZ"},"#I29LLZ")),Object(b.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," \u53ea\u6709\u6267\u884c\u8fc1\u79fb\u547d\u4ee4\u624d\u626b\u63cf\u79cd\u5b50\u6570\u636e ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29E6P"},"#I29E6P")),Object(b.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," \u89c4\u8303\u5316\u7ed3\u679c ",Object(b.b)("inlineCode",{parentName:"li"},"Successed")," \u5c5e\u6027\u540d\u4e3a ",Object(b.b)("inlineCode",{parentName:"li"},"Succeeded")," ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29NMV"},"#I29NMV")),Object(b.b)("li",{parentName:"ul"},"[\u79fb\u9664]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Mapster")," \u5bf9\u8c61\u7ec4\u4ef6\uff0c\u91c7\u7528\u63d0\u4f9b\u62d3\u5c55\u65b9\u5f0f ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29D2M"},"#I29D2M")),Object(b.b)("li",{parentName:"ul"},"[\u79fb\u9664]"," ",Object(b.b)("inlineCode",{parentName:"li"},"CacheManager")," \u62d3\u5c55\u7c7b ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29LU1"},"#I29LU1")),Object(b.b)("li",{parentName:"ul"},"[\u91cd\u6784]"," ",Object(b.b)("inlineCode",{parentName:"li"},"SaveChanges")," \u62e6\u622a\u5668 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I292LO"},"#I292LO")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u95ee\u9898\u4fee\u590d")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u672a\u6ce8\u518c\u7684\u6570\u636e\u5e93\u4e0a\u4e0b\u6587\u4e5f\u88ab\u5f15\u7528\u5168\u5c40\u67e5\u8be2\u62e6\u622a\u5668 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29ZXJ"},"#I29ZXJ")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u624b\u52a8\u8fd4\u56de ",Object(b.b)("inlineCode",{parentName:"li"},"BadObjectResult")," \u6216 ",Object(b.b)("inlineCode",{parentName:"li"},"ValidationProblemDetails")," \u7ed3\u679c\u7c7b\u578b\u65f6\u89c4\u8303\u5316\u7ed3\u679c\u5931\u6548 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29ZU9"},"#I29ZU9")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u52a8\u6001 WebApi ",Object(b.b)("inlineCode",{parentName:"li"},"KeepName"),"\uff0c",Object(b.b)("inlineCode",{parentName:"li"},"KeepVerb"),"\u3001",Object(b.b)("inlineCode",{parentName:"li"},"SplitCamelCase")," \u65e0\u6548 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29X90"},"#I29X90")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Sql\u4ee3\u7406")," \u8fd4\u56de ",Object(b.b)("inlineCode",{parentName:"li"},"\u5143\u7ec4")," \u7c7b\u578b\u51fa\u9519 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29SMV"},"#I29SMV")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"401\uff0c403")," \u72b6\u6001\u7801\u89c4\u8303\u5316\u8fd4\u56de\u503c\u5c5e\u6027\u53d8\u5927\u5199 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29M8Y"},"#I29M8Y")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"HttpContext")," \u7a7a\u5f02\u5e38 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29LU4"},"#I29LU4")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u63a5\u53e3\u65e0\u8fd4\u56de\u503c\u6ca1\u6709\u5e94\u7528\u89c4\u8303\u5316\u7ed3\u679c bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29GT7"},"#I29GT7")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u524d\u7aef ",Object(b.b)("inlineCode",{parentName:"li"},"Less")," \u914d\u7f6e\u6587\u4ef6\u5bfc\u81f4\u4e3b\u673a\u542f\u52a8\u5931\u8d25 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29E7P"},"#I29E7P")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u6267\u884c ",Object(b.b)("inlineCode",{parentName:"li"},"sql")," \u7ed3\u679c\u8f6c\u6cdb\u578b\u540e\u5c5e\u6027\u91cd\u590d\u8d4b\u503c bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29BUO"},"#I29BUO")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Swagger")," \u5173\u95ed ",Object(b.b)("inlineCode",{parentName:"li"},"MiniProfiler")," \u4e4b\u540e ",Object(b.b)("inlineCode",{parentName:"li"},"\u7ec4\u4e2d\u7ec4")," \u5931\u6548 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29789"},"#I29789")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u672a\u542f\u7528\u89c4\u8303\u5316\u7ed3\u679c\u65f6\u5f02\u5e38\u8fd4\u56de ",Object(b.b)("inlineCode",{parentName:"li"},"System.Object")," \u5b57\u7b26 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2969A"},"#I2969A")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u6b63\u6570\u6570\u636e\u9a8c\u8bc1 0 \u4e5f\u9a8c\u8bc1\u901a\u8fc7 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2955T"},"#I2955T")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u975e\u6cdb\u578b\u7c7b\u96c6\u6210\u6cdb\u578b\u63a5\u53e3\u4f9d\u8d56\u6ce8\u5165 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I294YT"},"#I294YT")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Swagger")," \u4e0d\u652f\u6301 ",Object(b.b)("inlineCode",{parentName:"li"},"new")," \u8986\u76d6\u7236\u7c7b\u7684 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I28Z1A"},"#I28Z1A")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"JsonSerializerUtility")," \u6ca1\u6709\u516c\u5f00 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I28WMI"},"#I28WMI")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"SqlSugar")," \u62d3\u5c55\u67e5\u8be2\u6cdb\u578b\u7c7b\u578b\u6ce8\u518c\u5f02\u5e38 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I28VMT"},"#I28VMT")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Furion Tools")," \u4e0d\u652f\u6301\u751f\u6210\u4e0d\u540c\u547d\u540d\u7a7a\u95f4\u7684\u5b9e\u4f53 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2A175"},"#I2A175")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u5168\u5c40\u62e6\u622a\u5668\u65e0\u6548 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2A7T2"},"#I2A7T2")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u65b0\u589e\u6216\u66f4\u65b0\u5ffd\u7565\u7a7a\u503c\u7a7a\u5f02\u5e38 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2AB6C"},"#I2AB6C")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u5176\u4ed6\u66f4\u6539")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u4f18\u5316]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Token")," \u751f\u6210\u52a0\u5bc6\u7b97\u6cd5 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29KIH"},"#I29KIH")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u6587\u6863\u53d8\u5316")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u65e5\u5fd7\u6587\u6863 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I28Y9D"},"#I28Y9D")),Object(b.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," \u6570\u636e\u5e93\u4e0a\u4e0b\u6587\u3001\u5b9e\u4f53\u62e6\u622a\u5668\u3001\u914d\u7f6e\u3001\u4e00\u5206\u949f\u5165\u95e8\u7b49\u7b49\u6587\u6863"))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u95ee\u7b54\u7b54\u7591")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u95ee\u7b54]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Swagger")," \u5982\u4f55\u5b9e\u73b0\u6388\u6743\u8bbf\u95ee ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I294F2"},"#I294F2")),Object(b.b)("li",{parentName:"ul"},"[\u95ee\u7b54]"," \u5982\u4f55\u5b9e\u73b0\u591a\u4e2a\u6570\u636e\u5e93\u591a\u5bf9\u591a\u5b9e\u4f53\u914d\u7f6e ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29G6S"},"#I29G6S")),Object(b.b)("li",{parentName:"ul"},"[\u95ee\u7b54]"," \u52a8\u6001 WebApi \u652f\u6301\u6587\u4ef6\u4e0a\u4f20\u5417 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29R5E"},"#I29R5E")),Object(b.b)("li",{parentName:"ul"},"[\u7591\u95ee]"," \u591a\u4e2a\u6570\u636e\u5e93\u4e0a\u4e0b\u6587\u65e0\u6cd5\u751f\u6210\u8fc1\u79fb\u4ee3\u7801 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2A6II"},"#I2A6II")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u4e0d\u505a\u5b9e\u73b0")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u5b9e\u73b0 ",Object(b.b)("inlineCode",{parentName:"li"},"BuildChange")," \u4f20\u5165\u8868\u540d ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I292SN"},"#I292SN")),Object(b.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u6267\u884c\u6570\u636e\u5e93\u64cd\u4f5c\u7ed3\u679c\u4e0d\u652f\u6301\u5c5e\u6027\u5ffd\u7565\u5927\u5c0f\u5199\u8d4b\u503c ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I29DRQ"},"#I29DRQ")),Object(b.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u5f15\u5165 ",Object(b.b)("inlineCode",{parentName:"li"},"Webhook")," \u673a\u5236 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2A3I0"},"#I2A3I0"))))),Object(b.b)("hr",null),Object(b.b)("h2",{id:"v140\uff08\u5df2\u53d1\u5e03\uff09"},"v1.4.0\uff08\u5df2\u53d1\u5e03\uff09"),Object(b.b)("ul",null,Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u65b0\u7279\u6027")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Furion")," \u652f\u6301\u4e8c\u7ea7\u865a\u62df\u76ee\u5f55\u90e8\u7f72\u529f\u80fd ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I28B77"},"#I28B77")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Furion.Template.RazorWithWebApi")," \u811a\u624b\u67b6 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I28QGI"},"#I28QGI")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Furion.Template.BlazorWithWebApi")," \u811a\u624b\u67b6 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I27Z3O"},"#I27Z3O")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"EFCore")," \u65f6\u6001\u67e5\u8be2\u62d3\u5c55 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I28AJ6"},"#I28AJ")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"[AppDbContext(\u8fde\u63a5\u5b57\u7b26\u4e32\uff0c\u6570\u636e\u5e93\u7c7b\u578b)]")," \u914d\u7f6e\u652f\u6301 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I28QTB"},"#I28QTB")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"DateTimeOffset")," \u8f6c ",Object(b.b)("inlineCode",{parentName:"li"},"DateTime")," \u62d3\u5c55\u65b9\u6cd5 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I27MQA"},"#I27MQA")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"ValidationTypes")," \u9a8c\u8bc1\u6b63\u5219\u8868\u8fbe\u5f0f\u667a\u80fd\u63d0\u793a ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2801V"},"#I2801V")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"ValiationTypes.WordWithNumber")," \u9a8c\u8bc1 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2805A"},"#I2805")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u83b7\u53d6\u5ba2\u6237\u7aef\u548c\u670d\u52a1\u7aef IP \u5730\u5740 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I28QV9"},"#I28QV9")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u7a81\u7834\u6027\u53d8\u5316")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u5347\u7ea7]"," .NET 5.0 \u7248\u672c\u81f3 .NET 5.0.1 \u7248\u672c ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I28QU1"},"#I28QU")),Object(b.b)("li",{parentName:"ul"},"[\u91cd\u6784]"," \u89c6\u56fe\u5f15\u64ce\u529f\u80fd\uff0c\u4f18\u5316\u4e0d\u89c4\u8303\u547d\u540d\u548c\u65b0\u589e\u5b57\u7b26\u4e32\u6a21\u677f\u7f16\u8bd1 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I28G0S"},"#I28G0S")),Object(b.b)("li",{parentName:"ul"},"[\u91cd\u6784]"," \u6570\u636e\u5e93\u5b9e\u4f53\u67e5\u627e\u7b97\u6cd5\uff0c\u5e76\u4f18\u5316\u6027\u80fd ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I28QUQ"},"#I28QUQ")),Object(b.b)("li",{parentName:"ul"},"[\u4f18\u5316]"," \u5e94\u7528\u542f\u52a8\u521d\u59cb\u5316\u6027\u80fd\u548c\u6570\u636e\u5e93\u7b2c\u4e00\u6b21\u81ea\u52a8\u914d\u7f6e ",Object(b.b)("inlineCode",{parentName:"li"},"DbSet")," \u6027\u80fd"))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u95ee\u9898\u4fee\u590d")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u591a\u6570\u636e\u5e93\u4e0a\u4e0b\u6587\u914d\u7f6e\u5b9a\u4f4d\u5668\u540e\u5b9e\u4f53\u65e0\u6cd5\u6b63\u786e\u751f\u6210 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2888L"},"#I2888L")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u591a\u79df\u6237\u6570\u636e\u5e93\u4e0a\u4e0b\u6587\u5b9e\u4f53\u751f\u6210 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2891G"},"#I2891G")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u5bf9\u8c61\u9a8c\u8bc1\u5931\u8d25\u63d0\u793a\u6d88\u606f\u6ca1\u6709\u5e94\u7528 ",Object(b.b)("inlineCode",{parentName:"li"},"JSON")," \u5927\u5c0f\u5199\u914d\u7f6e bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I27UTX"},"#I27UTX")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u4ed3\u50a8 ",Object(b.b)("inlineCode",{parentName:"li"},"Insert")," \u6216 ",Object(b.b)("inlineCode",{parentName:"li"},"Update")," \u65b9\u6cd5\u6307\u5b9a ",Object(b.b)("inlineCode",{parentName:"li"},"ignoreNullValues")," \u65e0\u6548 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I27UN6"},"#I27UN6")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Controller")," \u6d3e\u751f\u7c7b\u5982\u679c\u8d34\u4e86 ",Object(b.b)("inlineCode",{parentName:"li"},"[Route]")," \u7279\u6027\u540e\u51fa\u73b0\u5728 ",Object(b.b)("inlineCode",{parentName:"li"},"Swagger")," \u4e2d bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I27TN7"},"#I27TN7")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"SqlScalar")," \u6267\u884c ",Object(b.b)("inlineCode",{parentName:"li"},"sql")," \u8fd4\u56de ",Object(b.b)("inlineCode",{parentName:"li"},"Nullable")," \u7c7b\u578b\u51fa\u73b0\u8f6c\u6362\u5931\u8d25 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I27S2N"},"#I27S2N")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"[UnitOfWork]")," \u7279\u6027\u5f02\u5e38 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I27MLM"},"#I27MLM")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"sql")," \u9759\u6001\u6267\u884c\u65b9\u5f0f\u548c ",Object(b.b)("inlineCode",{parentName:"li"},"sql")," \u9ad8\u7ea7\u4ee3\u7406\u65e0\u6cd5\u76d1\u542c\u6570\u636e\u5e93\u8fde\u63a5\u72b6\u6001 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I27M4F"},"#I27M4F")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u4fee\u590d\u66f4\u6362 Json \u5e8f\u5217\u5316\u5e93\u65e0\u6548 bug\uff0c\u5982\u66ff\u6362\u4e3a ",Object(b.b)("inlineCode",{parentName:"li"},"Microsoft.AspNetCore.Mvc.NewtonsoftJson")," ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I27M43"},"#I27M43")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Furion Tools")," \u5de5\u5177\u751f\u6210\u6a21\u578b bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I27XI5"},"#I27XI5")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u8f6f\u5220\u9664\u6ca1\u6709\u751f\u6548 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2804I"},"#I2804I")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Furion Tools")," \u8bc6\u522b\u5e26\u591a\u4e2a ",Object(b.b)("inlineCode",{parentName:"li"},"\\\\")," \u7684\u8fde\u63a5\u5b57\u7b26\u4e32\u8bc6\u522b bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I280TS"},"#I280TS"),"\uff0c",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/pulls/91"},"#PR91")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Furion Tools")," \u65e0\u6cd5\u53d6\u6d88\u751f\u6210 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2816M"},"#I2816M")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"DateTimeOffset")," \u8f6c\u672c\u5730\u65f6\u95f4\u5dee 8 \u5c0f\u65f6 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I28BA9"},"#I28BA9")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u542f\u7528 ",Object(b.b)("inlineCode",{parentName:"li"},"bundle js&css")," \u538b\u7f29\u540e\u542f\u52a8\u5f02\u5e38 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I28KRP"},"#I28KR")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"ValidationTypes.Required")," \u65e0\u6548 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/pulls/98"},"#PR98")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u89c4\u8303\u5316\u7ed3\u679c",Object(b.b)("inlineCode",{parentName:"li"},"OnValidateFailed")," \u53c2\u6570\u540d\u62fc\u5199\u9519\u8bef bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/pulls/93"},"#PR93"),"\uff0c",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/pulls/92"},"#PR92")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u6388\u6743\u7ba1\u9053\u9a8c\u8bc1\u5931\u8d25\u8fd8\u663e\u793a\u7ed3\u679c bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/pulls/89"},"#PR89")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u5176\u4ed6\u66f4\u6539")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u66f4\u65b0]"," README.md \u53cb\u60c5\u8fde\u63a5\u5730\u5740 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/pulls/88"},"#PR88")),Object(b.b)("li",{parentName:"ul"},"[\u66f4\u65b0]"," \u6a21\u677f\u811a\u624b\u67b6\u6e90\u7801\uff0c\u6dfb\u52a0 ",Object(b.b)("inlineCode",{parentName:"li"},"EFCore Tools")," \u5e93 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/pulls/87"},"#PR87")),Object(b.b)("li",{parentName:"ul"},"[\u66f4\u65b0]"," README.md Nuget \u56fe\u6807 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/pulls/85"},"#PR85")),Object(b.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u5c06 ",Object(b.b)("inlineCode",{parentName:"li"},"List")," \u8f6c ",Object(b.b)("inlineCode",{parentName:"li"},"DateTable")," ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/pulls/97"},"#PR97")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u6587\u6863\u53d8\u5316")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u89c6\u56fe\u5f15\u64ce\u6a21\u677f\u6587\u6863 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I27ZVA"},"#I27ZVA")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"EFCore")," \u65f6\u6001\u67e5\u8be2\u6587\u6863 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I28AJ6"},"#I28AJ"),", ",Object(b.b)("a",{parentName:"li",href:"https://dotnetchina.gitee.io/furion/docs/dbcontext-hight-query/#91111-%E6%97%B6%E6%80%81%E6%9F%A5%E8%AF%A2"},"DOC")),Object(b.b)("li",{parentName:"ul"},"[\u66f4\u65b0]"," \u4ed3\u50a8\u6587\u6863\u4e66\u5199\u7eb0\u6f0f bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/pulls/90"},"#PR90")),Object(b.b)("li",{parentName:"ul"},"[\u66f4\u65b0]"," \u9009\u9879\u6587\u6863\u9519\u8bef bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/pulls/86"},"#PR86")),Object(b.b)("li",{parentName:"ul"},"[\u66f4\u65b0]"," ",Object(b.b)("inlineCode",{parentName:"li"},"\u5b9e\u4f53\u6570\u636e\u76d1\u542c\u5668")," \u6587\u6863\u4e66\u5199\u9519\u8bef bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/pulls/83/files"},"#PR83")),Object(b.b)("li",{parentName:"ul"},"[\u66f4\u65b0]"," \u6570\u636e\u5e93\u4e0a\u4e0b\u6587\u3001\u591a\u6570\u636e\u5e93\u3001\u811a\u624b\u67b6\u7b49\u6587\u6863"))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u95ee\u7b54\u7b54\u7591")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u5efa\u8bae]"," \u5e0c\u671b ",Object(b.b)("inlineCode",{parentName:"li"},"api")," \u8fd4\u56de\u7684\u503c\u81ea\u52a8\u5c06 null \u8f6c\u4e3a '' \u6216 ","[][#I286IJ]","(",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I286IJ)%EF%BC%8C%E3%80%90%E5%B7%B2%E5%85%B3%E9%97%AD%E3%80%91"},"https://gitee.com/dotnetchina/Furion/issues/I286IJ)\uff0c\u3010\u5df2\u5173\u95ed\u3011")),Object(b.b)("li",{parentName:"ul"},"[\u5efa\u8bae]"," \u6dfb\u52a0\u7f51\u5173\u529f\u80fd ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I27TP7"},"#I27TP7"),"\uff0c\u3010\u5df2\u5173\u95ed\u3011"),Object(b.b)("li",{parentName:"ul"},"[\u5efa\u8bae]"," \u65b0\u589e ",Object(b.b)("inlineCode",{parentName:"li"},"SqlQuery")," \u83b7\u53d6\u5355\u6761\u8bb0\u5f55\u65b9\u6cd5 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I28M1V"},"#I28M1V"),"\uff0c\u3010\u5df2\u5173\u95ed\u3011"),Object(b.b)("li",{parentName:"ul"},"[\u5efa\u8bae]"," \u5e0c\u671b\u53ef\u4ee5\u63d0\u4f9b\u96c6\u6210 ",Object(b.b)("inlineCode",{parentName:"li"},"Serilog")," \u4f8b\u5b50 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I282J4"},"#I282J4"),"\uff0c\u3010\u5df2\u5173\u95ed\u3011"),Object(b.b)("li",{parentName:"ul"},"[\u7591\u95ee]"," \u5982\u4f55\u901a\u8fc7\u7279\u6027\u914d\u7f6e\u552f\u4e00\u7ea6\u675f ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2891L"},"#I2891L"),"\uff0c\u3010\u5df2\u5173\u95ed\u3011"),Object(b.b)("li",{parentName:"ul"},"[\u7591\u95ee]"," \u600e\u4e48\u8bfb\u53d6 ",Object(b.b)("inlineCode",{parentName:"li"},"appsettings.json")," \u6570\u7ec4 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I27WUR"},"#I27WU"),"\uff0c\u3010\u5df2\u5173\u95ed\u3011"),Object(b.b)("li",{parentName:"ul"},"[\u7591\u95ee]"," ",Object(b.b)("inlineCode",{parentName:"li"},"IRepository")," \u51fa\u73b0\u7a7a\u5f02\u5e38 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I281IE"},"#I281IE"),"\uff0c\u3010\u5df2\u5173\u95ed\u3011"),Object(b.b)("li",{parentName:"ul"},"[\u7591\u95ee]"," \u89c4\u8303\u5316\u63a5\u53e3\u95ee\u9898\u95ee\u9898 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I28NMZ"},"#I28NMZ"),"\uff0c\u3010\u5df2\u5173\u95ed\u3011"),Object(b.b)("li",{parentName:"ul"},"[\u7591\u95ee]"," \u7edf\u4e00\u8fd4\u56de\u503c\u6a21\u578b\u4e2d OnResponseStatusCodes \u672a\u6267\u884c ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I28NNL"},"#I28NNL"),"\uff0c\u3010\u5df2\u5173\u95ed\u3011")))),Object(b.b)("hr",null),Object(b.b)("h2",{id:"v120\uff08\u5df2\u53d1\u5e03\uff09"},"v1.2.0\uff08\u5df2\u53d1\u5e03\uff09"),Object(b.b)("ul",null,Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u65b0\u7279\u6027")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u96ea\u82b1\u7b97\u6cd5 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I26OXG"},"#I26OXG"),", ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/pulls/78"},"#PR78")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"[AppDbContext]")," \u914d\u7f6e\u6570\u636e\u5e93\u63d0\u4f9b\u5668\u652f\u6301 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I27G3T"},"#I27G3T")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u5b9e\u4f53\u8868\u6570\u636e\u66f4\u6539\u76d1\u542c\u63a5\u53e3 ",Object(b.b)("inlineCode",{parentName:"li"},"IEntityDataChangedListener")," ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I278DD"},"#I278DD"),", ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I278LQ"},"#I278LQ")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u5168\u5c40\u670d\u52a1\u63a5\u53e3 AOP \u62e6\u622a\u529f\u80fd ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I278CP"},"#I278CP")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u5b9a\u4f4d\u5668\u4ed3\u50a8 ",Object(b.b)("inlineCode",{parentName:"li"},"IDbRepository")," ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I276Q3"},"#I276Q3")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u6570\u636e\u5e93\u64cd\u4f5c ",Object(b.b)("inlineCode",{parentName:"li"},"InsertOrUpdate")," \u652f\u6301\u6392\u9664\u7a7a\u5b57\u7b26\u4e32\u529f\u80fd ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I272OG"},"#I272OG")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u6570\u636e\u5e93\u64cd\u4f5c ",Object(b.b)("inlineCode",{parentName:"li"},"UpdateInclude")," \u548c ",Object(b.b)("inlineCode",{parentName:"li"},"UpdateExclude")," \u533f\u540d\u5bf9\u8c61\u652f\u6301 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I271X0"},"#I271X0")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u6570\u636e\u9a8c\u8bc1\u4f20\u5165\u7a7a\u5bf9\u8c61\u8df3\u8fc7\u9a8c\u8bc1\u652f\u6301 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I273R4"},"#I273R4")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u5e94\u7528\u542f\u52a8\u65f6\u652f\u6301\u6392\u9664\u7279\u5b9a\u914d\u7f6e\u6587\u4ef6\u81ea\u52a8\u52a0\u8f7d ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I26U0A"},"#I26U0A")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u5355\u4e2a\u5b9e\u4f53\u8868\u540d\u524d\u7f00\u652f\u6301 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I26LX0"},"#I26LX0")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"MySql")," \u6570\u636e\u5e93\u81ea\u52a8\u914d\u7f6e\u9ed8\u8ba4\u7248\u672c\u53f7 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I26XQ6"},"#I26XQ6")),Object(b.b)("li",{parentName:"ul"},"[\u4f18\u5316]"," \u6388\u6743\u5904\u7406\u7a0b\u5e8f\u4ee3\u7801"))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u7a81\u7834\u6027\u53d8\u5316")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u5b9e\u4f53\u8868\u6570\u636e\u66f4\u6539\u76d1\u542c\u63a5\u53e3 ",Object(b.b)("inlineCode",{parentName:"li"},"IEntityDataChangedListener")," ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I278DD"},"#I278DD"),", ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I278LQ"},"#I278LQ")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u5168\u5c40\u670d\u52a1\u63a5\u53e3 AOP \u62e6\u622a\u529f\u80fd ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I278CP"},"#I278CP")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u96ea\u82b1\u7b97\u6cd5 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I26OXG"},"#I26OXG"),", ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/pulls/78"},"#PR78")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u95ee\u9898\u4fee\u590d")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u89c6\u56fe\u5f15\u64ce\u52a0\u8f7d\u5916\u90e8\u7a0b\u5e8f\u96c6\u51fa\u9519 bug"),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u4f9d\u8d56\u6ce8\u5165\u4ee3\u7406\u63a5\u53e3\u62a5\u7a7a\u5bf9\u8c61\u5f02\u5e38 bug"),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"EFCore")," \u53d6\u6d88\u9644\u52a0\u5b9e\u4f53\u51fa\u9519 bug"),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u6570\u636e\u5e93\u4ed3\u50a8\u5728\u975e Web \u8bf7\u6c42\u4e0b\u51fa\u73b0\u7a7a\u5f02\u5e38 bug"),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u591a\u4e2a\u6388\u6743\u7b56\u7565\u5171\u5b58\u95ee\u9898\u51fa\u73b0\u65e0\u6548 bug"),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u53cb\u597d\u5f02\u5e38 ",Object(b.b)("inlineCode",{parentName:"li"},"Oop.Oh")," \u4e0d\u652f\u6301\u666e\u901a\u65b9\u6cd5 bug"),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u83b7\u53d6\u591a\u79df\u6237\u5bf9\u8c61\u65f6\u6570\u636e\u5e93\u4e0a\u4e0b\u6587\u51fa\u73b0\u4f5c\u7528\u57df\u9a8c\u8bc1\u5931\u8d25 bug"),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u5de5\u4f5c\u5355\u5143\u4e0d\u652f\u6301 ",Object(b.b)("inlineCode",{parentName:"li"},"Sql\u4ee3\u7406")," \u62e6\u622a bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I27GST"},"#I27GST")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u5176\u4ed6\u66f4\u6539")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u5173\u95ed][#I26O1F]","(",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I26O1F"},"https://gitee.com/dotnetchina/Furion/issues/I26O1F"),"), ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I27B2I"},"#I27B2I"),", ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I27BJ6"},"#I27BJ6"),", ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I27E5Z"},"#I27E5Z"),", ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I27EL4"},"#I27EL4")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u6587\u6863\u53d8\u5316")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e][\u5b9e\u4f53\u6570\u636e\u76d1\u542c\u5668]","(",Object(b.b)("a",{parentName:"li",href:"https://dotnetchina.gitee.io/furion/docs/dbcontext-entitytrigger"},"https://dotnetchina.gitee.io/furion/docs/dbcontext-entitytrigger"),") \u6587\u6863"),Object(b.b)("li",{parentName:"ul"},"[\u66f4\u65b0]"," \u4e00\u5206\u949f\u5165\u95e8\u3001\u5e94\u7528\u542f\u52a8\u3001\u5b98\u65b9\u811a\u624b\u67b6\u3001\u6570\u636e\u5e93\u64cd\u4f5c\u6307\u5357\u3001\u5bf9\u8c61\u6620\u5c04\u3001\u89c4\u8303\u5316\u6587\u6863\u3001\u5f02\u5e38\u5904\u7406\u3001\u9274\u6743\u6388\u6743\u6587\u6863")))),Object(b.b)("hr",null),Object(b.b)("h2",{id:"v110\uff08\u5df2\u53d1\u5e03\uff09"},"v1.1.0\uff08\u5df2\u53d1\u5e03\uff09"),Object(b.b)("ul",null,Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u65b0\u7279\u6027")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Db.GetDbContext()")," \u83b7\u53d6\u9ed8\u8ba4\u6570\u636e\u5e93\u4e0a\u4e0b\u6587\u65b9\u6cd5"),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"HttpContextUtility.GetCurrentHttpContext()")," \u83b7\u53d6\u5168\u5c40 ",Object(b.b)("inlineCode",{parentName:"li"},"HttpContext")," \u4e0a\u4e0b\u6587"),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"App.GetRequiredService<>")," \u89e3\u6790\u670d\u52a1\u65b9\u6cd5"),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"object.GetService<>")," \u5bf9\u8c61\u62d3\u5c55\u65b9\u6cd5"),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u7b56\u7565\u6388\u6743 ",Object(b.b)("inlineCode",{parentName:"li"},"PolicyPipeline")," \u57fa\u7c7b\u65b9\u6cd5\uff0c\u652f\u6301\u591a\u91cd\u5224\u65ad\u6388\u6743"),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"JWTEncryption.ValidateJwtBearerToken")," \u624b\u52a8\u9a8c\u8bc1\u9759\u6001\u65b9\u6cd5"),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u5168\u5c40\u6570\u636e\u5e93\u4e0a\u4e0b\u6587 ",Object(b.b)("inlineCode",{parentName:"li"},"InsertOrUpdateIgnoreNullValues")," \u548c ",Object(b.b)("inlineCode",{parentName:"li"},"EnabledEntityStateTracked")," \u5168\u5c40\u914d\u7f6e"),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Swagger Jwt\u6388\u6743")," \u5168\u5c40\u6388\u6743\u53c2\u6570 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I26GLR"},"#I26GLR")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"InsertOrUpdate")," \u652f\u6301\u81ea\u5b9a\u4e49\u5224\u65ad\u6761\u4ef6\u529f\u80fd ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I269Q1"},"#I269Q1")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u5b57\u7b26\u4e32\u5b57\u6bb5\u5c0f\u5199\u547d\u540d\u652f\u6301 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2695D"},"#I2695D")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u5b57\u7b26\u4e32\u6587\u672c\u5bf9\u6bd4\u529f\u80fd ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I268LE"},"#I268LE")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u5168\u5c40\u5f02\u5e38\u7279\u6027\u6d88\u606f\u529f\u80fd ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2662O"},"#I2662O")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Insert")," \u6216 ",Object(b.b)("inlineCode",{parentName:"li"},"Update")," \u6570\u636e\u5e93\u5ffd\u7565\u7a7a\u503c\u529f\u80fd ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I264Q4"},"#I264Q4")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u7a81\u7834\u6027\u53d8\u5316")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Fur")," \u9879\u76ee\u540d\u4e3a ",Object(b.b)("inlineCode",{parentName:"li"},"Furion")),Object(b.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Db.GetRequestDbContext<>()")," \u547d\u540d\u4e3a ",Object(b.b)("inlineCode",{parentName:"li"},"Db.GetDbContext<>()")),Object(b.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Db.GetDbContext<>()")," \u547d\u540d\u4e3a ",Object(b.b)("inlineCode",{parentName:"li"},"Db.GetDuplicateDbContext<>()")),Object(b.b)("li",{parentName:"ul"},"[\u91cd\u6784]"," ",Object(b.b)("inlineCode",{parentName:"li"},"App.GetService<>")," \u89e3\u6790\u670d\u52a1\u7684\u5e95\u5c42\u903b\u8f91\uff0c\u5927\u5927\u63d0\u9ad8\u4e86\u89e3\u6790\u670d\u52a1\u7684\u6027\u80fd"),Object(b.b)("li",{parentName:"ul"},"[\u91cd\u6784]"," \u6388\u6743\u6838\u5fc3\u4ee3\u7801\uff0c\u4fdd\u6301\u548c\u5fae\u8f6f\u4e00\u81f4\u7684\u6388\u6743\u89c4\u8303 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I26DCB"},"#I26DCB")),Object(b.b)("li",{parentName:"ul"},"[\u79fb\u9664]"," ",Object(b.b)("inlineCode",{parentName:"li"},"App.GetRequestService<>")," \u65b9\u6cd5"),Object(b.b)("li",{parentName:"ul"},"[\u79fb\u9664]"," ",Object(b.b)("inlineCode",{parentName:"li"},"ValidateJwtBearer")," Jwt \u6388\u6743\u65b9\u6cd5\uff0c\u65e0\u9700\u624b\u52a8\u5224\u65ad\u4e86"))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u95ee\u9898\u4fee\u590d")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," Furion \u5b98\u65b9\u811a\u624b\u67b6\u751f\u6210\u540e\u7f16\u8bd1\u5f02\u5e38 bug"),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Tenant")," \u5185\u7f6e\u5c5e\u6027\u4e0d\u662f ",Object(b.b)("inlineCode",{parentName:"li"},"virtual")," \u4fee\u9970 bug"),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"dockerfile")," \u65b0\u547d\u540d\u6784\u5efa\u5931\u8d25 bug"),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u81ea\u5b9a\u4e49\u89d2\u8272\u6388\u6743\u548c\u591a\u4e2a\u6388\u6743\u5171\u5b58\u51fa\u73b0 403 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I26H1L"},"#I26H1L")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"httpContext.GetEndpoint()")," \u7a7a\u5f02\u5e38 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/pulls/73"},"#PR73")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Oops.Oh")," \u7a7a\u5f02\u5e38\u548c\u4e0d\u652f\u6301\u670d\u52a1\u670d\u52a1\u629b\u5f02\u5e38 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I26EFU"},"#I26EFU"),"\uff0c",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I26GM4"},"#I26GM4")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"cli.ps")," \u751f\u6210\u6587\u4ef6\u7f16\u7801\u4e71\u7801 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I26DVT"},"#I26DVT")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Swagger")," \u6587\u4ef6\u4e0a\u4f20\u6309\u94ae\u4e0d\u663e\u793a ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I26B6U"},"#I26B6U")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u89c4\u8303\u5316\u7ed3\u679c\u6388\u6743\u72b6\u6001\u7801\u5e8f\u5217\u5316\u5927\u5c0f\u5199\u4e0d\u4e00\u81f4\u95ee\u9898 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I26B26"},"#I26B26")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u672a\u542f\u7528\u89c4\u8303\u5316\u7ed3\u679c\u65f6\u4e2d\u6587\u4e71\u7801 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I268T5"},"#I268T5")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"MySql")," \u5f02\u6b65\u5f02\u5e38\u6355\u83b7\u4e0d\u5230 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I265SO"},"#I265SO")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"cli.ps1")," \u63d0\u793a\u627e\u4e0d\u5230\u6570\u636e\u5e93\u8fde\u63a5\u5b57\u7b26\u4e32 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2647U"},"#I2647U")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u5176\u4ed6\u66f4\u6539")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u5176\u4ed6]"," \u4ee3\u7801\u6027\u80fd\u5c0f\u4f18\u5316\u548c\u5c0f\u8c03\u6574"),Object(b.b)("li",{parentName:"ul"},"[\u5173\u95ed][#I265JV]","(",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I265JV)%EF%BC%8C%5B#I26ERA%5D(https://gitee.com/dotnetchina/Furion/issues/I26ERA)%EF%BC%8C"},"https://gitee.com/dotnetchina/Furion/issues/I265JV)\uff0c[#I26ERA](https://gitee.com/dotnetchina/Furion/issues/I26ERA)\uff0c")," ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I26EVW"},"#I26EVW"),"\uff0c",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I26GHC"},"#I26GHC"),"\uff0c",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I26GJ1"},"#I26GJ1"),"\uff0c",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I26O1F"},"#I26O1F")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u6587\u6863\u53d8\u5316")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u66f4\u65b0]"," \u4e00\u5206\u949f\u5165\u95e8\u3001\u5b89\u5168\u9274\u6743\u3001\u6570\u636e\u5e93\u7b49\u6587\u6863")))),Object(b.b)("hr",null),Object(b.b)("h2",{id:"v103\uff08\u5df2\u53d1\u5e03\uff09"},"v1.0.3\uff08\u5df2\u53d1\u5e03\uff09"),Object(b.b)("ul",null,Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u65b0\u7279\u6027")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," Mvc \u6a21\u677f\u811a\u624b\u67b6\uff1a",Object(b.b)("inlineCode",{parentName:"li"},"Fur.Template.Mvc")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," WebApi \u6a21\u677f\uff1a",Object(b.b)("inlineCode",{parentName:"li"},"Fur.Template.Api")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," Mvc/WebApi \u6a21\u677f\uff1a",Object(b.b)("inlineCode",{parentName:"li"},"Fur.Template.App")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," Razar Pages \u6a21\u677f\uff1a",Object(b.b)("inlineCode",{parentName:"li"},"Fur.Template.Razor")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," Blazor \u6a21\u677f\uff1a",Object(b.b)("inlineCode",{parentName:"li"},"Fur.Template.Blazor")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u7a81\u7834\u6027\u53d8\u5316")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," ",Object(b.b)("inlineCode",{parentName:"li"},"PagedList")," \u5230 ",Object(b.b)("inlineCode",{parentName:"li"},"System.Collections.Generic")," \u547d\u540d\u7a7a\u95f4\u4e0b"),Object(b.b)("li",{parentName:"ul"},"[\u4f18\u5316]"," \u89e3\u6790\u670d\u52a1\u6027\u80fd\u95ee\u9898\uff0c\u5e95\u5c42\u4ee3\u7801\u5927\u91cf\u4f18\u5316"))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u95ee\u9898\u4fee\u590d")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"ApiSears.ControllerEnd"),"\u4e0d\u8d77\u4f5c\u7528 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I25KH6"},"#I25KH6")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"RemoteRequest")," \u8bf7\u6c42\u5b8c\u6210\u7ed3\u679c\u5e8f\u5217\u5316\u5c5e\u6027\u5927\u5c0f\u5199\u95ee\u9898 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I25I8R"},"#I25I8R")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"HttpContext.GetEndpoinet()")," \u7a7a\u5f02\u5e38 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/pulls/73"},"#PR73")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u5176\u4ed6\u66f4\u6539")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"\u65e0"))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u6587\u6863\u53d8\u5316")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u66f4\u65b0]"," \u5165\u95e8\u6587\u6863\u3001\u6570\u636e\u5e93\u4e0a\u4e0b\u6587\u6587\u6863\u3001\u591a\u6570\u636e\u5e93\u64cd\u4f5c\u6587\u6863")))),Object(b.b)("hr",null),Object(b.b)("h2",{id:"v102\uff08\u5df2\u53d1\u5e03\uff09"},"v1.0.2\uff08\u5df2\u53d1\u5e03\uff09"),Object(b.b)("ul",null,Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u65b0\u7279\u6027")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Pomelo.EntityFrameworkCore.MySql")," \u6700\u65b0 .NET 5 \u5305\u914d\u7f6e ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I24ZQK"},"#I24ZQK")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},".AddDateTimeJsonConverter(format)")," \u65f6\u95f4\u683c\u5f0f\u5e8f\u5217\u5316\u914d\u7f6e"),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"DateTime")," \u548c ",Object(b.b)("inlineCode",{parentName:"li"},"DateTimeOffset")," \u7c7b\u578b\u5e8f\u5217\u5316\u683c\u5f0f\u914d\u7f6e ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I253FI"},"#I253FI")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u7a81\u7834\u6027\u53d8\u5316")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u66f4\u65b0]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Mapster")," \u5305\u81f3 ",Object(b.b)("inlineCode",{parentName:"li"},"7.0.0")," \u7248"),Object(b.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," ",Object(b.b)("inlineCode",{parentName:"li"},"App.Services")," \u540d\u4e3a ",Object(b.b)("inlineCode",{parentName:"li"},"App.ServiceProvider")),Object(b.b)("li",{parentName:"ul"},"[\u79fb\u9664]"," ",Object(b.b)("inlineCode",{parentName:"li"},"App.ApplicationServices")," \u548c ",Object(b.b)("inlineCode",{parentName:"li"},"App.GetRequestService<>()")),Object(b.b)("li",{parentName:"ul"},"[\u79fb\u9664]"," \u975e Web \u4e3b\u673a\u6ce8\u5165\u62d3\u5c55"))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u95ee\u9898\u4fee\u590d")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"services.AddFriendlyException()")," \u7f3a\u5c11\u914d\u7f6e\u6ce8\u5165 bug"),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u6570\u636e\u5e93\u4e0a\u4e0b\u6587\u6c60\u88ab\u91ca\u653e\u548c\u9ad8\u5e76\u53d1\u4e0b\u5185\u5b58\u6ea2\u51fa bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I2524K"},"#I2524K"),"\uff0c",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I24UMN"},"#I24UMN")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Sql\u4ee3\u7406")," \u8fd4\u56de\u7a7a\u6570\u636e\u65f6\u5f02\u5e38 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I24TCK"},"#I24TCK")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u5de5\u4f5c\u5355\u5143 ",Object(b.b)("inlineCode",{parentName:"li"},"[UnitOfWork]")," \u591a\u6570\u636e\u5e93\u88ab\u91ca\u653e bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I24Q6W"},"#I24Q6W")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u5176\u4ed6\u66f4\u6539")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," ",Object(b.b)("inlineCode",{parentName:"li"},"EntityBase")," \u548c ",Object(b.b)("inlineCode",{parentName:"li"},"Entity")," \u6240\u6709\u5c5e\u6027\u4e3a ",Object(b.b)("inlineCode",{parentName:"li"},"vitural")," \u4fee\u9970"),Object(b.b)("li",{parentName:"ul"},"[\u4f18\u5316]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Jwt")," \u8bfb\u53d6\u548c\u89e3\u6790\u6027\u80fd"),Object(b.b)("li",{parentName:"ul"},"[\u4f18\u5316]"," \u4f18\u5316\u4ee3\u7801\u652f\u6301 C# 9.0 \u6700\u65b0\u8bed\u6cd5"),Object(b.b)("li",{parentName:"ul"},"[\u4f18\u5316]"," ",Object(b.b)("inlineCode",{parentName:"li"},"MD5")," \u52a0\u5bc6\u6027\u80fd ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/pulls/71"},"#PR71")),Object(b.b)("li",{parentName:"ul"},"[\u79fb\u9664]"," \u65e0\u7528\u6216\u672a\u4f7f\u7528\u4ee3\u7801"))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u6587\u6863")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u66f4\u65b0]"," \u6570\u636e\u5e93\u4e0a\u4e0b\u6587\u3001\u591a\u6570\u636e\u5e93\u3001\u4e00\u5206\u949f\u5165\u95e8\u6587\u6863")))),Object(b.b)("hr",null),Object(b.b)("h2",{id:"v100\uff08\u5df2\u53d1\u5e03\uff09"},"v1.0.0\uff08\u5df2\u53d1\u5e03\uff09"),Object(b.b)("ul",null,Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u65b0\u7279\u6027")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u7f51\u7edc\u8bf7\u6c42 ",Object(b.b)("inlineCode",{parentName:"li"},"RemoteRequest")," \u7ec4\u4ef6 ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I1YYWD"},"#I1YYWD")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},".AddInjectBase()")," \u6ce8\u5165\uff0c\u53ea\u5305\u542b\u57fa\u7840\u670d\u52a1\u6ce8\u5165"),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u6240\u6709\u670d\u52a1\u90fd\u652f\u6301 ",Object(b.b)("inlineCode",{parentName:"li"},"IServiceCollection")," \u548c ",Object(b.b)("inlineCode",{parentName:"li"},"IMvcBuilder")," \u6ce8\u5165"),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u629b\u5f02\u5e38\u72b6\u6001\u7801\u8bbe\u7f6e\u529f\u80fd ",Object(b.b)("inlineCode",{parentName:"li"},"StatusCode")),Object(b.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Swagger")," \u5e8f\u5217\u5316\u652f\u6301 ",Object(b.b)("inlineCode",{parentName:"li"},"Pascal")," \u5c5e\u6027\u547d\u540d\u65b9\u5f0f"))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u7a81\u7834\u6027\u53d8\u5316")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u66f4\u65b0]"," ",Object(b.b)("strong",{parentName:"li"},"\u6240\u6709\u7684\u5305\u4e3a ",Object(b.b)("inlineCode",{parentName:"strong"},".NET 5")," \u6b63\u5f0f\u7248")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u95ee\u9898\u4fee\u590d")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"SqlProxy")," \u4ee3\u7406\u5f02\u6b65\u5904\u7406 bug"),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u6570\u636e\u5e93\u7c7b\u578b ",Object(b.b)("inlineCode",{parentName:"li"},"Datetime")," \u8f6c ",Object(b.b)("inlineCode",{parentName:"li"},"DateTimeOffset")," bug"),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u5c5e\u6027\u9996\u5b57\u6bcd\u5927\u5c0f\u5199\u5e8f\u5217\u5316\u4e0d\u5339\u914d\u51fa\u73b0 ",Object(b.b)("inlineCode",{parentName:"li"},"null")," bug"),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u5bf9\u8c61\u5e8f\u5217\u5316\u4e2d\u6587\u51fa\u73b0\u4e71\u7801 bug"),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u9ed8\u8ba4\u5e8f\u5217\u5316\u914d\u7f6e\u65e0\u6548 bug"),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u6570\u636e\u5e93\u975e\u4f9d\u8d56\u6ce8\u5165\u65b9\u5f0f\u63d0\u4ea4\u65e0\u6548 bug"),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u5e94\u7528\u7a0b\u5e8f\u6c60\u63d0\u4ea4\u6240\u6709 ",Object(b.b)("inlineCode",{parentName:"li"},"DbContext")," \u7a7a\u5f02\u5e38 bug"),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Saas")," \u591a\u79df\u6237 ",Object(b.b)("inlineCode",{parentName:"li"},"Tenant")," \u7c7b\u578b\u5b57\u7b26\u4e32\u5c5e\u6027\u5728 ",Object(b.b)("inlineCode",{parentName:"li"},"MySql")," \u6570\u636e\u5e93\u4e0b\u51fa\u73b0 ",Object(b.b)("inlineCode",{parentName:"li"},"longtext")," \u7c7b\u578b bug"),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Mvc")," \u81ea\u52a8\u9a8c\u8bc1\u5b57\u7b26\u4e32\u7a7a\u503c bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I24M2T"},"#I24M2T")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u679a\u4e3e\u6ce8\u91ca\u88ab\u8986\u76d6 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I24N6J"},"#I24N6J")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u5ffd\u7565\u89c4\u8303\u5316\u7ed3\u679c\u65e0\u6548 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I24B8P"},"#I24B8P")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Swagger")," \u9ed8\u8ba4 ",Object(b.b)("inlineCode",{parentName:"li"},"ContentType")," \u4e0d\u662f ",Object(b.b)("inlineCode",{parentName:"li"},"applicaiton/json")," bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I24F3U"},"#I24F3U")),Object(b.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u5185\u7f6e ",Object(b.b)("inlineCode",{parentName:"li"},"System.Text.Json")," \u548c ",Object(b.b)("inlineCode",{parentName:"li"},"Newtonsoft.Json")," \u51b2\u7a81 bug ",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/issues/I24F3U"},"#I24F3U")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u5176\u4ed6\u66f4\u6539")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," ",Object(b.b)("inlineCode",{parentName:"li"},"Fur")," \u6846\u67b6\u57df\u540d\u4e3a\uff1a",Object(b.b)("a",{parentName:"li",href:"https://furion.pro"},"https://furion.pro")),Object(b.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," \u4ed3\u50a8 ",Object(b.b)("inlineCode",{parentName:"li"},"FromSqlRaw")," \u548c ",Object(b.b)("inlineCode",{parentName:"li"},"FromSqlInterpolated")," \u63a5\u53e3\u4f4d\u7f6e"),Object(b.b)("li",{parentName:"ul"},"[\u4f18\u5316]"," \u6570\u636e\u52a0\u89e3\u5bc6\u6027\u80fd\uff0c",Object(b.b)("a",{parentName:"li",href:"https://gitee.com/dotnetchina/Furion/pulls/70"},"#PR70")))),Object(b.b)("li",{parentName:"ul"},Object(b.b)("p",{parentName:"li"},Object(b.b)("strong",{parentName:"p"},"\u6587\u6863")),Object(b.b)("ul",{parentName:"li"},Object(b.b)("li",{parentName:"ul"},"[\u66f4\u65b0]"," README.md\u3001\u6846\u67b6\u4ecb\u7ecd\u3001\u6570\u636e\u5e93\u4e0a\u4e0b\u6587\u3001\u914d\u7f6e\u9009\u9879\u3001\u591a\u79df\u6237\u3001\u8de8\u57df\u6587\u6863")))))}o.isMDXComponent=!0},205:function(e,t,a){"use strict";a.d(t,"a",(function(){return m})),a.d(t,"b",(function(){return O}));var i=a(0),n=a.n(i);function b(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function r(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,i)}return a}function l(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var b=Object.getOwnPropertySymbols(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var p=n.a.createContext({}),o=function(e){var t=n.a.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},m=function(e){var t=o(e.components);return n.a.createElement(p.Provider,{value:t},e.children)},s={inlineCode:"code",wrapper:function(e){var t=e.children;return n.a.createElement(n.a.Fragment,{},t)}},u=n.a.forwardRef((function(e,t){var a=e.components,i=e.mdxType,b=e.originalType,r=e.parentName,p=c(e,["components","mdxType","originalType","parentName"]),m=o(a),u=i,O=m["".concat(r,".").concat(u)]||m[u]||s[u]||b;return a?n.a.createElement(O,l(l({ref:t},p),{},{components:a})):n.a.createElement(O,l({ref:t},p))}));function O(e,t){var a=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var b=a.length,r=new Array(b);r[0]=u;var l={};for(var c in t)hasOwnProperty.call(t,c)&&(l[c]=t[c]);l.originalType=e,l.mdxType="string"==typeof e?e:i,r[1]=l;for(var p=2;p 3. 文件上传下载 | Furion - + @@ -30,7 +30,7 @@
using (var stream = System.IO.File.Create(filePath))
{
await formFile.CopyToAsync(stream);
}
}
}
return Ok(new { count = files.Count, size });
}
- + diff --git a/handbook/build/blog/httpcontext/index.html b/handbook/build/blog/httpcontext/index.html index 861b955e330..c0234722643 100644 --- a/handbook/build/blog/httpcontext/index.html +++ b/handbook/build/blog/httpcontext/index.html @@ -8,7 +8,7 @@ 2. HttpContext 应用 | Furion - + @@ -27,7 +27,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

2. HttpContext 应用

dotNET China

dotNET China

为中国 .NET 开发者提供优质的资讯和技术分享。

HttpContext 重大调整#

ASP.NET 的时代,我们通常通过 HttpContext 全局静态类获取请求上下文,但在 ASP.NET Core 中,HttpContext 是一个非静态的抽象类,无法手动创建,也无法通过静态获取。

虽然在 ASP.NET Core 中无法直接获取 HttpContext 对象。但是微软也提供了注入 IHttpContextAccessor 方式获取。

HttpContext 多种获取方式#

ControllerBase 派生类中#

ControllerBase 派生类中,我们可以直接通过 HttpContext 属性获取 HttpContext 对象。

通过注入 IHttpContextAccessor#

Furion 框架中,默认已经注册了 IHttpContextAccessor 服务,所以我们可以通过构造函数注入该对象获取。

public class AppService
{
public AppService(IHttpContextAccessor httpContextAccessor)
{
var httpContext = httpContextAccessor.HttpContext;
}
}

通过 HttpContextLocal 静态类#

Furion 框架提供了 HttpContextLocal 静态类方式获取 HttpContext,如:

var HttpContext = HttpContextLocal.Current();

通过 App.HttpContext#

App 静态类也提供了 App.HttpContext 获取 HttpContext 对象。

HttpContext 拓展方法#

Furion 框架也提供了一些常用的 HttpContext 拓展方法

获取当前请求的特性#

var attribute = httpContext.GetMetadata<SomeAttribute>();

设置 Swagger 自动授权#

httpContext.SigninToSwagger("你的token");

退出 Swagger 授权#

httpContext.SignoutToSwagger();

获取本地 IP 地址#

var ipv4 = httpContext.GetLocalIpAddressToIPv4();
var ipv6 = httpContext.GetLocalIpAddressToIPv6();

获取客户端 IP 地址#

var ipv4 = httpContext.GetRemoteIpAddressToIPv4();
var ipv6 = httpContext.GetRemoteIpAddressToIPv6();

判断是否是 Ajax 请求#

var isAjaxRequest = httpContext.IsAjaxRequest();
- + diff --git a/handbook/build/blog/index.html b/handbook/build/blog/index.html index b902b0bb3ad..44dcda08c5b 100644 --- a/handbook/build/blog/index.html +++ b/handbook/build/blog/index.html @@ -8,7 +8,7 @@ Blog | Furion - + @@ -30,7 +30,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

3. 文件上传下载

dotNET China

dotNET China

为中国 .NET 开发者提供优质的资讯和技术分享。

文件下载#

[HttpGet, NonUnify]
public IActionResult FileDownload(string path, string fileName)
{
string filePath = Path.GetFullPath("~/temp/").Replace("~\\", "") + path;
return new FileStreamResult(new FileStream(filePath, FileMode.Open), "application/octet-stream") { FileDownloadName = fileName };
}

2. HttpContext 应用

dotNET China

dotNET China

为中国 .NET 开发者提供优质的资讯和技术分享。

HttpContext 重大调整#

ASP.NET 的时代,我们通常通过 HttpContext 全局静态类获取请求上下文,但在 ASP.NET Core 中,HttpContext 是一个非静态的抽象类,无法手动创建,也无法通过静态获取。

虽然在 ASP.NET Core 中无法直接获取 HttpContext 对象。但是微软也提供了注入 IHttpContextAccessor 方式获取。

HttpContext 多种获取方式#

- + diff --git a/handbook/build/blog/tags/download/index.html b/handbook/build/blog/tags/download/index.html index e1a576050cb..f19b72871fc 100644 --- a/handbook/build/blog/tags/download/index.html +++ b/handbook/build/blog/tags/download/index.html @@ -8,7 +8,7 @@ Posts tagged "download" | Furion - + @@ -28,7 +28,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

One post tagged with "download"

View All Tags

3. 文件上传下载

dotNET China

dotNET China

为中国 .NET 开发者提供优质的资讯和技术分享。

文件下载#

[HttpGet, NonUnify]
public IActionResult FileDownload(string path, string fileName)
{
string filePath = Path.GetFullPath("~/temp/").Replace("~\\", "") + path;
return new FileStreamResult(new FileStream(filePath, FileMode.Open), "application/octet-stream") { FileDownloadName = fileName };
}
- + diff --git a/handbook/build/blog/tags/furion/index.html b/handbook/build/blog/tags/furion/index.html index 458f4c0bf01..7a66f82932d 100644 --- a/handbook/build/blog/tags/furion/index.html +++ b/handbook/build/blog/tags/furion/index.html @@ -8,7 +8,7 @@ Posts tagged "furion" | Furion - + @@ -30,7 +30,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

3 posts tagged with "furion"

View All Tags

3. 文件上传下载

dotNET China

dotNET China

为中国 .NET 开发者提供优质的资讯和技术分享。

文件下载#

[HttpGet, NonUnify]
public IActionResult FileDownload(string path, string fileName)
{
string filePath = Path.GetFullPath("~/temp/").Replace("~\\", "") + path;
return new FileStreamResult(new FileStream(filePath, FileMode.Open), "application/octet-stream") { FileDownloadName = fileName };
}

2. HttpContext 应用

dotNET China

dotNET China

为中国 .NET 开发者提供优质的资讯和技术分享。

HttpContext 重大调整#

ASP.NET 的时代,我们通常通过 HttpContext 全局静态类获取请求上下文,但在 ASP.NET Core 中,HttpContext 是一个非静态的抽象类,无法手动创建,也无法通过静态获取。

虽然在 ASP.NET Core 中无法直接获取 HttpContext 对象。但是微软也提供了注入 IHttpContextAccessor 方式获取。

HttpContext 多种获取方式#

- + diff --git a/handbook/build/blog/tags/furos/index.html b/handbook/build/blog/tags/furos/index.html index b5fb99af8bc..fb46dd2c91b 100644 --- a/handbook/build/blog/tags/furos/index.html +++ b/handbook/build/blog/tags/furos/index.html @@ -8,7 +8,7 @@ Posts tagged "furos" | Furion - + @@ -30,7 +30,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

3 posts tagged with "furos"

View All Tags

3. 文件上传下载

dotNET China

dotNET China

为中国 .NET 开发者提供优质的资讯和技术分享。

文件下载#

[HttpGet, NonUnify]
public IActionResult FileDownload(string path, string fileName)
{
string filePath = Path.GetFullPath("~/temp/").Replace("~\\", "") + path;
return new FileStreamResult(new FileStream(filePath, FileMode.Open), "application/octet-stream") { FileDownloadName = fileName };
}

2. HttpContext 应用

dotNET China

dotNET China

为中国 .NET 开发者提供优质的资讯和技术分享。

HttpContext 重大调整#

ASP.NET 的时代,我们通常通过 HttpContext 全局静态类获取请求上下文,但在 ASP.NET Core 中,HttpContext 是一个非静态的抽象类,无法手动创建,也无法通过静态获取。

虽然在 ASP.NET Core 中无法直接获取 HttpContext 对象。但是微软也提供了注入 IHttpContextAccessor 方式获取。

HttpContext 多种获取方式#

- + diff --git a/handbook/build/blog/tags/httpcontext/index.html b/handbook/build/blog/tags/httpcontext/index.html index b0c468122cc..5e45e665a57 100644 --- a/handbook/build/blog/tags/httpcontext/index.html +++ b/handbook/build/blog/tags/httpcontext/index.html @@ -8,7 +8,7 @@ Posts tagged "httpcontext" | Furion - + @@ -28,7 +28,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

One post tagged with "httpcontext"

View All Tags

2. HttpContext 应用

dotNET China

dotNET China

为中国 .NET 开发者提供优质的资讯和技术分享。

HttpContext 重大调整#

ASP.NET 的时代,我们通常通过 HttpContext 全局静态类获取请求上下文,但在 ASP.NET Core 中,HttpContext 是一个非静态的抽象类,无法手动创建,也无法通过静态获取。

虽然在 ASP.NET Core 中无法直接获取 HttpContext 对象。但是微软也提供了注入 IHttpContextAccessor 方式获取。

HttpContext 多种获取方式#

- + diff --git a/handbook/build/blog/tags/index.html b/handbook/build/blog/tags/index.html index b4374b44751..5b867c278ba 100644 --- a/handbook/build/blog/tags/index.html +++ b/handbook/build/blog/tags/index.html @@ -8,7 +8,7 @@ Tags | Furion - + @@ -26,7 +26,7 @@ - + diff --git a/handbook/build/blog/tags/net-5/index.html b/handbook/build/blog/tags/net-5/index.html index 6809e0fbd99..f8dad378a2e 100644 --- a/handbook/build/blog/tags/net-5/index.html +++ b/handbook/build/blog/tags/net-5/index.html @@ -8,7 +8,7 @@ Posts tagged ".net5" | Furion - + @@ -30,7 +30,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

3 posts tagged with ".net5"

View All Tags

3. 文件上传下载

dotNET China

dotNET China

为中国 .NET 开发者提供优质的资讯和技术分享。

文件下载#

[HttpGet, NonUnify]
public IActionResult FileDownload(string path, string fileName)
{
string filePath = Path.GetFullPath("~/temp/").Replace("~\\", "") + path;
return new FileStreamResult(new FileStream(filePath, FileMode.Open), "application/octet-stream") { FileDownloadName = fileName };
}

2. HttpContext 应用

dotNET China

dotNET China

为中国 .NET 开发者提供优质的资讯和技术分享。

HttpContext 重大调整#

ASP.NET 的时代,我们通常通过 HttpContext 全局静态类获取请求上下文,但在 ASP.NET Core 中,HttpContext 是一个非静态的抽象类,无法手动创建,也无法通过静态获取。

虽然在 ASP.NET Core 中无法直接获取 HttpContext 对象。但是微软也提供了注入 IHttpContextAccessor 方式获取。

HttpContext 多种获取方式#

- + diff --git a/handbook/build/blog/tags/net/index.html b/handbook/build/blog/tags/net/index.html index ce4d24d96ee..7a65406dfac 100644 --- a/handbook/build/blog/tags/net/index.html +++ b/handbook/build/blog/tags/net/index.html @@ -8,7 +8,7 @@ Posts tagged ".net" | Furion - + @@ -30,7 +30,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

3 posts tagged with ".net"

View All Tags

3. 文件上传下载

dotNET China

dotNET China

为中国 .NET 开发者提供优质的资讯和技术分享。

文件下载#

[HttpGet, NonUnify]
public IActionResult FileDownload(string path, string fileName)
{
string filePath = Path.GetFullPath("~/temp/").Replace("~\\", "") + path;
return new FileStreamResult(new FileStream(filePath, FileMode.Open), "application/octet-stream") { FileDownloadName = fileName };
}

2. HttpContext 应用

dotNET China

dotNET China

为中国 .NET 开发者提供优质的资讯和技术分享。

HttpContext 重大调整#

ASP.NET 的时代,我们通常通过 HttpContext 全局静态类获取请求上下文,但在 ASP.NET Core 中,HttpContext 是一个非静态的抽象类,无法手动创建,也无法通过静态获取。

虽然在 ASP.NET Core 中无法直接获取 HttpContext 对象。但是微软也提供了注入 IHttpContextAccessor 方式获取。

HttpContext 多种获取方式#

- + diff --git a/handbook/build/blog/tags/netcore/index.html b/handbook/build/blog/tags/netcore/index.html index d8f2a6bd56d..bf2ba3ad26a 100644 --- a/handbook/build/blog/tags/netcore/index.html +++ b/handbook/build/blog/tags/netcore/index.html @@ -8,7 +8,7 @@ Posts tagged ".netcore" | Furion - + @@ -30,7 +30,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

3 posts tagged with ".netcore"

View All Tags

3. 文件上传下载

dotNET China

dotNET China

为中国 .NET 开发者提供优质的资讯和技术分享。

文件下载#

[HttpGet, NonUnify]
public IActionResult FileDownload(string path, string fileName)
{
string filePath = Path.GetFullPath("~/temp/").Replace("~\\", "") + path;
return new FileStreamResult(new FileStream(filePath, FileMode.Open), "application/octet-stream") { FileDownloadName = fileName };
}

2. HttpContext 应用

dotNET China

dotNET China

为中国 .NET 开发者提供优质的资讯和技术分享。

HttpContext 重大调整#

ASP.NET 的时代,我们通常通过 HttpContext 全局静态类获取请求上下文,但在 ASP.NET Core 中,HttpContext 是一个非静态的抽象类,无法手动创建,也无法通过静态获取。

虽然在 ASP.NET Core 中无法直接获取 HttpContext 对象。但是微软也提供了注入 IHttpContextAccessor 方式获取。

HttpContext 多种获取方式#

- + diff --git a/handbook/build/blog/tags/upload/index.html b/handbook/build/blog/tags/upload/index.html index 52af47abc6e..79554e38b9a 100644 --- a/handbook/build/blog/tags/upload/index.html +++ b/handbook/build/blog/tags/upload/index.html @@ -8,7 +8,7 @@ Posts tagged "upload" | Furion - + @@ -28,7 +28,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

One post tagged with "upload"

View All Tags

3. 文件上传下载

dotNET China

dotNET China

为中国 .NET 开发者提供优质的资讯和技术分享。

文件下载#

[HttpGet, NonUnify]
public IActionResult FileDownload(string path, string fileName)
{
string filePath = Path.GetFullPath("~/temp/").Replace("~\\", "") + path;
return new FileStreamResult(new FileStream(filePath, FileMode.Open), "application/octet-stream") { FileDownloadName = fileName };
}
- + diff --git a/handbook/build/blog/welcome/index.html b/handbook/build/blog/welcome/index.html index fd4c4894869..ddc3ff94767 100644 --- a/handbook/build/blog/welcome/index.html +++ b/handbook/build/blog/welcome/index.html @@ -8,7 +8,7 @@ 1. Furion 介绍 | Furion - + @@ -27,7 +27,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

1. Furion 介绍

dotNET China

dotNET China

为中国 .NET 开发者提供优质的资讯和技术分享。

star fork GitHub stars GitHub forks GitHub license nuget

让 .NET 开发更简单,更通用,更流行。

💐 序言#

无私奉献不是天方夜谭,有时候,我们也可以做到。

🍕 名字的由来#

故事是这样子的:

自微软宣布 .NET 5 平台消息之后,就琢磨着开发一个基于 .NET 5 平台的开发框架,想做第一个吃 .NET 5 螃蟹尝鲜之人。

一开始想到了 Lazier 作为框架的名称,中文有 更懒 的意思。符合我的 “一切从简,只为了更懒” 的开发理念。

但是 更懒更烂 中文读音相近且没有特色,而且寓意也不是很好,对此换名问题苦恼了好些天。

刚好有一次在 QQ 群中无意间刷到了群友发的 “先知” 单词:Furion,就那一刻,就认定它了!

Furion 中文有 先知 的意思,恰好符合我创造框架的初衷。所以,Furion 就诞生了。

🍔 关于 LOGO#

Furion 标志设计理念是借鉴著名的 袋鼠理论 设计的。

袋鼠具有长腿、育袋、自我奔跑特点。

  • 长腿:代表着 Furion 拥有稳健的双腿,走在科技的前沿,走的更远,跑的更快。
  • 育袋:小育袋、大作为。期待 Furion 能够育孕出更多 .NET 优秀开发者和生机勃勃的生态。
  • 自我奔跑Furion 自身也要不断学习、不断进步、不断创新、不断开拓。

🍯 开源案例#

  • Admin.NET:基于 Furion 的通用权限管理平台。
  • 考试君:基于 Furion 的在线考试系统
  • 园丁:基于 Furion + Blazor 的超简单后台管理系统
  • Queer:基于 Furion + Layui 的通用型管理系统
  • Pear Admin:基于 Furion + PearAdmin 管理系统
  • JoyAdmin:基于 Furion + iviewadmin 开发的管理系统
  • YShop:基于 Furion + Vue 开发的移动电商项目

🍟 文档地址#

目前文档正在逐步完善中。

🥦 系列教程#

🌭 开源地址#

🍿 Docker 镜像#

  • Docker Hub 线上镜像
docker run --name furion -p 5000:80 monksoul/furion:v1.4.3
  • 手动 打包镜像

打开 CMD/Shell/PowerShell 进入 Furion 项目根目录打包 Furion 镜像:

docker build -t furion:v1.4.3 .

打包成功后,直接 docker run

docker run --name furion -p 5000:80 furion:v1.4.3

🥥 框架拓展包#

包类型名称版本描述
nugetFurionnugetFurion 核心包
nugetFurion.Extras.Authentication.JwtBearernugetFurion Jwt 拓展包
nugetFurion.Extras.DependencyModel.CodeAnalysisnugetFurion CodeAnalysis 拓展包
nugetFurion.Extras.Web.HttpContextnugetFurion HttpContext 拓展包
nugetFurion.Extras.ObjectMapper.MapsternugetFurion Mapster 拓展包
nugetFurion.Extras.DatabaseAccessor.SqlSugarnugetFurion SqlSugar 拓展包
nugetFurion.Extras.DatabaseAccessor.DappernugetFurion Dapper 拓展包
nugetFurion.Extras.Logging.SerilognugetFurion Serilog 拓展包

🍄 框架脚手架#

模板类型名称版本描述
nugetFurion.Template.MvcnugetMvc 模板
nugetFurion.Template.ApinugetWebApi 模板
nugetFurion.Template.AppnugetMvc/WebApi 模板
nugetFurion.Template.RazornugetRazorPages 模板
nugetFurion.Template.RazorWithWebApinugetRazorPages/WebApi 模板
nugetFurion.Template.BlazornugetBlazor 模板
nugetFurion.Template.BlazorWithWebApinugetBlazor/WebApi 模板

如何使用脚手架

🍎 框架特点#

  • 全新面貌:基于 .NET 5 平台,没有历史包袱
  • 极易入门:只需要一个 Inject() 即可完成配置
  • 极速开发:内置丰富的企业应用开发功能
  • 极少依赖:框架只依赖两个第三方包
  • 极其灵活:轻松面对多变复杂的需求
  • 极易维护:采用独特的架构思想,只为长久维护设计
  • 完整文档:提供完善的开发文档

🥞 架构设计#

正在整理中...

🥝 功能模块#

🥐 框架依赖#

Furion 为了追求极速入门,极致性能,尽可能的不使用或减少第三方依赖。目前 Furion 仅集成了以下两个依赖:

麻雀虽小五脏俱全。Furion 即使只集成了这两个依赖,但是主流的 依赖注入/控制反转AOP 面向切面编程,事件总线数据验证数据库操作 等等一个都不少。

🥗 环境要求#

  • Visual Studio 2019 16.8 +
  • .NET 5 SDK +
  • .Net Standard 2.1 +

🥪 支持平台#

  • 运行环境
    • Windows
    • Linux
    • MacOS
    • Docker/K8S/K3S/Rancher
    • Xamarin/MAUI
  • 数据库
    • SqlServer
    • Sqlite
    • Azure Cosmos
    • MySql
    • MariaDB
    • PostgreSQL
    • InMemoryDatabase
    • Oracle
    • Firebird
    • 达梦数据库
  • 应用部署
    • Kestrel
    • Nginx
    • Jexus
    • IIS
    • Apache
    • PM2
    • Supervisor
    • 单文件
    • 容器(Docker/K8S/K3S/Rancher)

🍖 关于性能#

Furion 目前采用 Visual Studio 2019 16.8 自带性能测试和 JMeter 进行测试,由于篇幅有限,只贴部分测试图,测试结果如下:


🌴 Stars 趋势图#

Stargazers over time

🍚 关于作者#

一个拥有近 13 年开发经验 .NETer。喜欢分享,喜欢新技术,在互联网多个技术领域皆有涉猎,MIP(dotNET China Most Influential Professional) 专家,同时多次获得开源中国 Gitee 授予 GVP 证书。

🍤 项目成员#

🎈 欢迎更多的开发者加入 Furion 大家庭。

🍝 他们都在用#

  • 百签科技(广东)有限公司
  • 码为科技(广州)有限公司
  • 夫上技术(阳江)有限公司
  • 广州启顺国际货运代理有限公司
  • 森丰供应链服务(广州)有限公司
  • 中山赢友网络科技有限公司
  • 中山模思软件科技有限公司
  • 珠海市恒泰新软件有限责任公司
  • 珠海思诺锐创软件有限公司
  • 深圳市易胜科技有限公司
  • 重庆虫儿飞科技有限公司
  • 重庆林木森科技有限公司
  • 深圳市品立方科技有限公司
  • 上海奥达科股份有限公司
  • 中山市泓升软件科技有限公司
  • 唐山天权建筑科技有限公司
  • 北京帝龙科技有限公司
  • 深圳市希立网络有限公司
  • 广州市飞帆计算机技术有限公司
  • 泉州市润海信息科技有限公司
  • 成都市彼岸里信息科技有限公司
  • 福建省山水生活服务集团有限公司
  • 安徽宝典网络科技有限公司
  • 西安空岛网络科技有限公司
  • 果糖大数据科技(南通)有限公司
  • 上海楷青信息技术有限公司
  • 上海邮银通信发展有限公司
  • 合纵动力软件科技有限公司
  • 深圳合纵动力软件科技有限公司
  • 北京帝龙科技有限公司

如果您的项目使用到 Furion 开发,可以告诉我们。

🍻 贡献代码#

Furion 遵循 Apache-2.0 开源协议,欢迎大家提交 PRIssue

如果要为项目做出贡献,请查看贡献指南

🍍 捐赠列表#

注:排序按捐赠顺序书写

捐赠人昵称捐赠金额(元)附语
🤴 爱吃油麦菜100感谢您的开源项目!
👳‍♂️ 麦壳饼200感谢您的开源项目!
👨 Sun100感谢您的开源项目!
👶 d61761720感谢您的开源项目!
👦 Diqiguoji00816.66见贤思齐
👲 nodyang100感谢您的开源项目!
👳‍♀️ mictxd100吹过的牛都实现。
🧓 欧流全10希望将来超越 Spring
👨‍⚕️ lionkon10...看了框架感觉拿来学习是很不错的...
😤 好人!10Nice 的小僧,我们的 dotnetchina 马上火起来了
😮 木木 Woody10感谢您的开源项目!
😚 Joker HouQQ 超级会员一个月
🤠 ccdfzQQ 专属红包 199
🌝 天夫李总支付宝 6666Furion 非常有意思,持续关注
😝 六尘子微信红包 199公司已经使用,小小敬意
🤠 ccdfzQQ 专属红包 200赞助一根内存条
🤑 邓亮灯28.88感谢您的开源项目!
😬 天道酬勤微信二维码 188小小心意
🥰 却月居士QQ 专属红包 100恭喜发财
🤩 鲁旭100感谢您的开源项目!
😬 散客行微信二维码 666终于找到一个不错的框架
😌 本心100项目功能很强大
🙆‍♂️ 毕业生100请你喝杯咖啡
🦹‍♀️ 猪鼻子微信二维码 668
🧟‍♂️ 明年·今日200使用的框架里最爽的,最理想的!加油
👨‍🎓 过去的过去50感谢您的开源项目!
👨‍🔧 万里兮100新公司的第一个项目从 Furion 开始
👴 Muphalem20很热心很亲切的开发者,加油!
💂‍♂️ 吃锅巴的码农微信二维码 500就冲你的文档写得好!
🤴 三重罗生门微信红包 200下次烤鱼你请!
🤵 李涛10加油,我们看到了 dotnet 美好的明天 :)
😂 !@#$%^&QQ 专属红包 100刚接触 furion,文档真棒
😵 李斌20看到一个不错的框架,学习学习,感谢作者的无私奉献
😞 逞强QQ 专属红包 20恭喜发财
🤒 顾锦松QQ 专属红包 200期待文档完成时候
🧟‍♀️ 哈哈微信赞赏码 1000点赞作者!
🍍 Z微信赞赏码 100恭喜孩子诞生,谢谢大佬
🍲 海涛50恭喜
😣 h微信赞赏码 100qq82683656
👱‍♀️ 冷大大微信赞赏码 100加快文档和教学补充哦,另外需要钉钉群,平常不用 QQ
👜 腾坤微信赞赏码 10感谢您的开源项目,QQ:565728589
🚆 文耶耶微信赞赏码 10很棒
🎟 Cynthiax微信转账 5000一路看着过来,小小心意
🥴 一花一世界微信赞赏码 10感谢开源,感谢持续更新
🥪 。微信赞赏码 2感谢
🎄微信赞赏码 20感谢你的开源项目
🍖 班卓微信赞赏码 9.9新年快乐
🥖 雨天裸奔的猫微信赞赏码 10加油!好东西,期待更多新特性
🍖 班卓微信赞赏码 9.9加个鸡腿
🍘 Egota Tiya微信赞赏码 6.66真的不错,准备使用这个框架
🤩 李氏天下微信赞赏码 200坚持下去
🎗 Trube微信赞赏码 200感恩
🧦 不长胡子的毛微信赞赏码 100Fur
👓 醉酒码农微信赞赏码 1000单次只能赞助 200,捐赠 5 次,支持 Furion
😢 XIUXIN微信赞赏码 20谢大佬,春天里的第一杯奶茶
👩‍🦳 吴鹏微信赞赏码 100感谢这么好的框架和文档
🧔 SymmmeeQQ 专属红包 20太牛了
🤴 隐居~~~QQ 专属红包 100支持一下吧
👵 饭粥微信赞赏码 666666666666
🎭 Free微信赞赏码 20感谢开源。比较敬业的架构师,支持一下
👑 时不待我微信赞赏码 50请你喝咖啡
😋 Eway5微信赞赏码 99找 abp 搜到 Furion 的,没想到国内有这么优秀的贡献者

非常感谢您们的支持,正是因为您们,中国开源才可以越走越远,Furion 越走越远。

如果想成为 Furion 支持者或赞助商,请考虑:

🥔 QQ 交流群#

dotNET 中国 ① 🥇(已满

dotNET 中国 ② 🥈(已满

dotNET 中国 ③(空余)

🧆 友情链接#

👉 Furion 👉 SqlSugar 👉 Layx 👉 t-io 👉 ThinkPHP 👉 Hutool 👉 BootstrapAdmin 👉 BootstrapBlazor 👉 IoTSharp 👉 Anno.Core 👉 WaterCloud 👉 OpenAuth.Net

🍵 特别鸣谢#

在这里特别感谢 QQ 网名:蓝狐星Furion 提供演示云服务器。

- + diff --git a/handbook/build/docs/appstartup/index.html b/handbook/build/docs/appstartup/index.html index bce3792198f..9980c66d323 100644 --- a/handbook/build/docs/appstartup/index.html +++ b/handbook/build/docs/appstartup/index.html @@ -8,7 +8,7 @@ 3. 应用启动 Startup | Furion - + @@ -49,7 +49,7 @@
namespace Furion.Web.Entry
{
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
}
}
}
Startup.cs 代码迁移

只需要将 ConfigureServicesConfigure 方法代码迁移到 Furion.Web.Core.Startup.cs 中即可,而 Startup.cs 中两个方法留空即可。

非常简单吧。我们后续创建任何 MVCRazorPagesBlazor 项目只需要添加 Furion.Web.Core 引用和调用 Inject() 即可。

3.6 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by Monk
- + diff --git a/handbook/build/docs/auth-control/index.html b/handbook/build/docs/auth-control/index.html index 1ac1f764492..2a1e7a95171 100644 --- a/handbook/build/docs/auth-control/index.html +++ b/handbook/build/docs/auth-control/index.html @@ -8,7 +8,7 @@ 15. 安全鉴权 | Furion - + @@ -33,7 +33,7 @@
namespace Furion.Web.Core
{
/// <summary>
/// JWT 授权自定义处理程序
/// </summary>
public class JwtHandler : AppAuthorizeHandler
{
/// <summary>
/// 重写 Handler 添加自动刷新收取逻辑
/// </summary>
/// <param name="context"></param>
/// <returns></returns>
public override async Task HandleAsync(AuthorizationHandlerContext context)
{
// 自动刷新 token
if (JWTEncryption.AutoRefreshToken(context, context.GetCurrentHttpContext()))
{
await AuthorizeHandleAsync(context);
}
else context.Fail(); // 授权失败
}
/// <summary>
/// 验证管道,也就是验证核心代码
/// </summary>
/// <param name="context"></param>
/// <param name="httpContext"></param>
/// <returns></returns>
public override Task<bool> PipelineAsync(AuthorizationHandlerContext context, DefaultHttpContext httpContext)
{
// 检查权限,如果方法时异步的就不用 Task.FromResult 包裹,直接使用 async/await 即可
return Task.FromResult(true);
}
}
}

15.5.3 客户端部分#

客户端每次请求需将 accessTokenrefreshToken 放到请求报文头中传送到服务端,格式为:

Authorization: Bearer 你的token
X-Authorization: Bearer 你的刷新token
特别注意

在正常开发中,refreshToken 无需每次请求携带,而是 accessToken 即将过期之后携带即可。可以在客户端自行判断 accessToken 是否即将过期。

如果 Token 过期,那么 Furion 将自动根据有效期内的 refreshToken 自动生成新的 AceessToken,并在 响应报文 中返回,如:

access-token: 新的token
x-access-token: 新的刷新token
存储新的 Token

前端需要获取 响应报文 新的 token 和刷新 token 替换之前在客户处存储旧的 token 和刷新 token。

15.6 获取 Jwt 存储的信息#

// 获取 `Jwt` 存储的信息
var userId = App.User?.FindFirstValue("键");

注意引入 System.Security.Claims 命名空间

15.7 反馈与建议#

与我们交流

给 Furion 提 Issue


了解更多

想了解更多 鉴权授权 知识可查阅 ASP.NET Core - 安全和标识 章节。

Last updated on by 百小僧
- + diff --git a/handbook/build/docs/author/index.html b/handbook/build/docs/author/index.html index 8a9e537b056..f2fae65ecb5 100644 --- a/handbook/build/docs/author/index.html +++ b/handbook/build/docs/author/index.html @@ -8,7 +8,7 @@ 1.2 关于作者 | Furion - + @@ -22,7 +22,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

1.2 关于作者

互联网账号#

  • 百小僧
  • Monk/MonkSoul

技术能力#

自 2008 年 接触 IT 这个行业也有十余年了,在 后端(.NET/.NET Core/Java/PHP)、移动端(Xamarin/小程序/Java/Objective-C)、桌面端(Winform/WPF/Electron)、前端(Node/React/Vue/Angular)、设计(Photoshop、CDR、AI)等主流领域略知一二。

同时在技术培训领域也多有涉足。MIP(dotNET China Most Influential Professional) 专家,同时多次获得开源中国 Gitee 授予 GVP 证书。

兴趣爱好#

对新技术颇感兴趣,喜欢开源事业,喜欢分享技术。

喜欢看博客园、看开源中国、看 Github/Gitee、看抖音、看动漫、看美剧。

个人主页#

https://gitee.com/monksoul

https://github.com/monksoul

Last updated on by Monk
- + diff --git a/handbook/build/docs/benchmark/index.html b/handbook/build/docs/benchmark/index.html index b81a0bc358b..be11e6b574f 100644 --- a/handbook/build/docs/benchmark/index.html +++ b/handbook/build/docs/benchmark/index.html @@ -8,7 +8,7 @@ 29.3 基准测试 | Furion - + @@ -28,7 +28,7 @@
[Benchmark]
public byte[] Md5() => md5.ComputeHash(data);
}
public class Program
{
public static void Main(string[] args)
{
var summary = BenchmarkRunner.Run<Md5VsSha256>();
}
}
}

29.3.3.2 查看结果#

运行控制器程序,将得到以下结果

BenchmarkDotNet=v0.12.0, OS=Windows 10.0.17763.805 (1809/October2018Update/Redstone5)
Intel Core i7-7700K CPU 4.20GHz (Kaby Lake), 1 CPU, 8 logical and 4 physical cores
[Host] : .NET Framework 4.7.2 (4.7.3468.0), X64 RyuJIT
Net472 : .NET Framework 4.7.2 (4.7.3468.0), X64 RyuJIT
NetCoreApp30 : .NET Core 3.0.0 (CoreCLR 4.700.19.46205, CoreFX 4.700.19.46214), X64 RyuJIT
CoreRt30 : .NET CoreRT 1.0.28231.02 @Commit: 741d61493c560ba96e8151f9e56876d4d3828489, X64 AOT
Mono : Mono 6.4.0 (Visual Studio), X64
MethodRuntimeNMeanErrorStdDevRatio
Sha256.NET 4.7.210007.735 us0.1913 us0.4034 us1.00
Sha256.NET Core 3.010003.989 us0.0796 us0.0745 us0.50
Sha256CoreRt 3.010004.091 us0.0811 us0.1562 us0.53
Sha256Mono100013.117 us0.2485 us0.5019 us1.70
Md5.NET 4.7.210002.872 us0.0552 us0.0737 us1.00
Md5.NET Core 3.010001.848 us0.0348 us0.0326 us0.64
Md5CoreRt 3.010001.817 us0.0359 us0.0427 us0.63
Md5Mono10003.574 us0.0678 us0.0753 us1.24
Sha256.NET 4.7.21000074.509 us1.5787 us4.6052 us1.00
Sha256.NET Core 3.01000036.049 us0.7151 us1.0025 us0.49
Sha256CoreRt 3.01000036.253 us0.7076 us0.7571 us0.49
Sha256Mono10000116.350 us2.2555 us3.0110 us1.58
Md5.NET 4.7.21000017.308 us0.3361 us0.4250 us1.00
Md5.NET Core 3.01000015.726 us0.2064 us0.1930 us0.90
Md5CoreRt 3.01000015.627 us0.2631 us0.2461 us0.89
Md5Mono1000030.205 us0.5868 us0.6522 us1.74

29.3.3.3 导出报表#

也可以导出各种图表

29.3.4 反馈与建议#

与我们交流

给 Furion 提 Issue


了解更多

想了解更多 BenchmarkDotNet 知识可查阅 BenchmarkDotNet 官网

Last updated on by Monk
- + diff --git a/handbook/build/docs/cache/index.html b/handbook/build/docs/cache/index.html index a8f90c41810..29a5f698b5b 100644 --- a/handbook/build/docs/cache/index.html +++ b/handbook/build/docs/cache/index.html @@ -8,7 +8,7 @@ 14. 分布式缓存 | Furion - + @@ -43,7 +43,7 @@
await _cache.SetAsync("cachedTimeUTC", encodedCurrentTimeUTC, options);
return RedirectToPage();
}
}

14.6 分布式缓存建议#

确定 IDistributedCache 最适合你的应用的实现时,请考虑以下事项:

  • 现有基础结构
  • 性能要求
  • 成本
  • 团队经验

缓存解决方案通常依赖于内存中的存储以快速检索缓存的数据,但是,内存是有限的资源,并且很昂贵。 仅将常用数据存储在缓存中。

通常,Redis 缓存提供比 SQL Server 缓存更高的吞吐量和更低的延迟。 但是,通常需要进行基准测试来确定缓存策略的性能特征。

SQL Server 用作分布式缓存后备存储时,对缓存使用同一数据库,并且应用的普通数据存储和检索会对这两种情况的性能产生负面影响。 建议使用分布式缓存后备存储的专用 SQL Server 实例。

14.7 反馈与建议#

与我们交流

给 Furion 提 Issue


了解更多

想了解更多 分布式缓存 知识可查阅 ASP.NET Core - 分布式缓存 章节。

Last updated on by Monk
- + diff --git a/handbook/build/docs/case/index.html b/handbook/build/docs/case/index.html index 84e7fca42a2..2aaafd6e9b5 100644 --- a/handbook/build/docs/case/index.html +++ b/handbook/build/docs/case/index.html @@ -8,7 +8,7 @@ 1.4 框架案例 | Furion - + @@ -22,7 +22,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

1.4 框架案例

1.4.1 开源案例#

  • Admin.NET:基于 Furion 的通用权限管理平台。
  • 考试君:基于 Furion 的在线考试系统
  • 园丁:基于 Furion + Blazor 的超简单后台管理系统
  • Queer:基于 Furion + Layui 的通用型管理系统
  • Pear Admin:基于 Furion + PearAdmin 管理系统
  • JoyAdmin:基于 Furion + iviewadmin 开发的管理系统
  • YShop:基于 Furion + Vue 开发的移动电商项目

如果您使用了 Furion 进行项目开发,可以告诉我们,点击底部的 Edit this page 进行编辑添加。

Last updated on by Monk
- + diff --git a/handbook/build/docs/configuration/index.html b/handbook/build/docs/configuration/index.html index 8ac5707432c..a3eed1e9cd4 100644 --- a/handbook/build/docs/configuration/index.html +++ b/handbook/build/docs/configuration/index.html @@ -8,7 +8,7 @@ 4.1 配置 | Furion - + @@ -25,7 +25,7 @@
namespace Furion.Web.Entry.Controllers
{
[Route("api/[controller]")]
public class DefaultController : ControllerBase
{
[HttpGet]
public string Get([FromServices] IConfiguration configuration)
{
return $@"名称:{configuration["AppInfo:Name"]},
版本:{configuration["AppInfo:Version"]},
公司:{configuration["AppInfo:Company"]}";
}
}
}
依赖注入的方式

通过依赖注入注入实例有几种方式:

  • 构造函数注入方式
private readonly IConfiguration _configuration;
public DefaultController(IConfiguration configuration)
{
_configuration = configuration;
}
  • 参数注入方式 [FromServices]
public string Get([FromServices] IConfiguration configuration)
{
}
  • 属性注入方式
public IConfiguration Configuration { get; set; }

想了解更多关于《ASP.NET Core - 依赖注入》 知识

4.1.2.3 如何选择读取方式#

  • 在可依赖注入类中,依赖注入 IConfiguration 读取
  • 在静态类/非依赖注入类中,选择 App.Configuration[jsonKey] 读取

4.1.3 路径符 查找节点#

ASP.NET Core 中,配置采用 : 分隔符来读取分层配置数据。如上述例子中的 AppInfo:Name。如有更多层级数据则只需要通过 : 进入下一层节点即可。

假设我们有以下配置信息:

{
"AppInfo": {
"Name": "Furion",
"Version": "1.0.0",
"Company": {
"Name": "Baiqian",
"Address": {
"City": "中国",
"Province": "广东省",
"Detail": "中山市东区紫马公园西门"
}
}
}
}
var companyName = App.Configuration["AppInfo:Name"]; // => Furion

4.1.4 自定义配置文件#

大多情况下,我们的配置只需要在 appsettings.json 中配置即可,但一些特殊情况下,我们希望某些组件或功能拥有独立的配置,这个时候就需要用到自定义配置,Furion 目前支持 .json.xml 两种方式配置,如:

Furion.Web.Entry/emailsetting.json
{
"outlook": {
"smtp": {
"server": "smtp.office365.com",
"port": "587",
"ssl": "STARTTLS"
},
"pop": {
"server": "outlook.office365.com",
"port": "995",
"ssl": "TLS"
}
}
}
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<MyKey>MyXMLFile Value</MyKey>
<Position>
<Title>Title from MyXMLFile</Title>
<Name>Name from MyXMLFile</Name>
</Position>
<Logging>
<LogLevel>
<Default>Information</Default>
<Microsoft>Warning</Microsoft>
</LogLevel>
</Logging>
</configuration>
xml 配置事项

如果采用 xml 配置,那么文件名必须以 .config.xml 结尾(不区分大小写)。

特别说明

Furion 框架会在启动时自动扫描每一个项目层根目录下的 *.json*.xml 文件加入配置中,所以无需手工配置。

新增 *.json*.xml 文件的属性复制到输出目录设置为始终复制或较新复制,否则不会载入。另外配置文件不能出现重名,也就是保证整个项目中配置文件名字唯一。

同时 Furion 提供了非常灵活的方式支持自定义配置文件读取,如:

4.1.4.1 读取 emailsetting.json 配置#

读取自定义配置文件和读取 appsettings.json 一致,系统会自动从多个配置文件中读取输入,如:

var smtpServer = App.Configuration["outlook:smtp:server"]; // => smtp.office365.com

4.1.4.2 排除特定配置文件#

有些时候,我们不需要 .json.xml 自动载入配置中,我们只需要在启动层 appsettings.json 中添加 IgnoreConfigurationFiles 节点即可:

{
"IgnoreConfigurationFiles": ["runtime.json"]
}

4.1.5 不同环境读取#

在实际应用开发中,我们可能会根据不同的环境加载不同的配置文件,如 数据库连接字符串

这时我们只需要遵循特定命名规范 {name}.{Environment}.json 即可。如:

  • appsettings.Development.json
  • appsettings.Staging.json
  • appsettings.Production.json
  • emailsetting.Development.json
  • emailsetting.Staging.json
  • emailsetting.Production.json

这时,ASP.NET Core 会在应用启动时自动加载不同环境的配置文件。

4.1.6 配置更改通知(热更新#

.NET Core 应用程序中,配置支持更改通知,也就是热更新操作。一旦监听到 appsetting.json 或自定义配置文件发生变动,就会触发 OnChange 方法。代码如下:

var appInfoConfiguration = App.Configuration["AppInfo"];
ChangeToken.OnChange(() => appInfoConfiguration.GetReloadToken(), () =>
{
var name = appInfoConfiguration["Name"]; // 实时的最新值
var version = appInfoConfiguration["Version"]; // 实时的最新值
});

4.1.7 手动添加配置文件#

有些时候,我们的配置文件没有放在项目的根目录下,这时候我们需要手动载入自定义配置文件,只需要在 Program.cs 中加载即可:

public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((hostingContext, config) =>
{
// 加载自定义配置
config.AddJsonFile("MyConfig.json", optional: true, reloadOnChange: true);
})
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
补充说明
  • 获取项目目录:AppContext.BaseDirectory
  • 获取网站根目录:Directory.GetCurrentDirectory()

4.1.8 配置的优缺点#

  • 优点

    • 能够在系统运行时快速读取
    • 无需额外配置
  • 缺点

    • 存在重复读取
    • 通过硬编码字符串读取,容易出错
    • 不能设置默认值
    • 不能在运行环境中动态配置
    • 不能验证配置有效性
    • 不支持更改通知

4.1.9 配置使用场景#

如果只需要一次性读取配置信息,则使用配置,否则应该使用 《4.2 选项》代替。

4.1.10 反馈与建议#

与我们交流

给 Furion 提 Issue


了解更多

想了解更多 配置 知识可查阅 ASP.NET Core - 配置 章节。

Last updated on by SamWangCoder
- + diff --git a/handbook/build/docs/contribute/index.html b/handbook/build/docs/contribute/index.html index 1cf5c8240e7..4083d1be895 100644 --- a/handbook/build/docs/contribute/index.html +++ b/handbook/build/docs/contribute/index.html @@ -8,7 +8,7 @@ 31. 贡献指南 | Furion - + @@ -22,7 +22,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

31. 贡献指南

提交错误报告#

如果您在 XXX 中发现了一个不存在安全问题的漏洞,请在 XXX 仓库中的 Issues 中搜索,以防该漏洞已被提交,如果找不到漏洞可以创建一个新的 Issues,如果发现了一个安全问题请不要将其公开,请参阅安全问题处理方式,提交错误报告时应该详尽。

安全问题处理#

本项目中对安全问题处理的形式,项目核心人员确认编辑,该部分内容可以根据项目情况添加。

解决现有问题#

通过查看仓库的 Issues 列表何以发现需要处理的问题信息,可以尝试解决其中的某个问题。

如何提出新功能#

提出新功能有些项目使用 Issues 的 Feature 标签进行管理,有些则通过邮件的形式统一收集,在收集后项目内人员会进行确认开发,一般的将确认开发的功能会放入下一个版本的任务列表。

如何设置开发环境并运行测试#

如果是通过 Git 管理可以从 git clone xxx 开始编写,将开发环境的配置信息,IDE 的设置等信息配置文档编写。

变更日志填写规则#

  1. 使用现在时态
  2. 第一行字数限制
  3. 提交内容的约束

编码约定#

  • 项目内编码约定文件:.editorconfig

分支处理约定#

  • 分支处理形式,如 gitFlow

合并 PR 的形式#

在什么情况下可以合并到 master/main:

  1. 通过 CI
  2. 两个及以上的维护者通过.
  3. 最新版本
Last updated on by Monk
- + diff --git a/handbook/build/docs/cors/index.html b/handbook/build/docs/cors/index.html index 385d21b91f0..e9bc16ff2a6 100644 --- a/handbook/build/docs/cors/index.html +++ b/handbook/build/docs/cors/index.html @@ -8,7 +8,7 @@ 16. CORS 跨域 | Furion - + @@ -27,7 +27,7 @@
app.UseCorsAccessor();
// ...
}
}
}
特别注意

services.AddCorsAccessor(); 需在 services.AddControllers() 之前注册。

app.UseCorsAccessor(); 需在 app.UseRouting();app.UseAuthentication(); 之间注册。

16.4.2 配置允许跨域域名#

小提醒

默认情况下,Furion 允许所有域名来源访问,也就是无需配置任何来源域名,另外前端也需要设置请求参数:withCredentials:false

如果需要指定特定域名,则添加以下配置即可:

{
"CorsAccessorSettings": {
"PolicyName": "自定义跨域策略名",
"WithOrigins": ["http://localhost:4200", "https://furion.pro"]
}
}

16.5 CorsAccessorSettings 配置#

  • CorsAccessorSettings
    • PolicyName:跨域策略名,字符串类型,必填,默认 FurCorsAccessor
    • WithOrigins:允许跨域的域名列表,字符串数组类型,默认 [ "http://localhost:4200" ]
    • WithHeaders:请求表头,没有配置则允许所有表头,字符串数组类型
    • WithExposedHeaders:响应标头,字符串数组类型
    • WithMethods:设置跨域允许请求谓词,没有配置则允许所有,字符串数组类型
    • AllowCredentials:跨域请求中的凭据,bool 类型
    • SetPreflightMaxAge:设置预检过期时间,int 类型

16.6 使用 axios 前端注意事项#

由于 axios 对跨域有特定的需要,需要响应报文中添加特定 Header 才能放行,如:Access-Control-Expose-Headers: xxxxx,所以,如果前端使用了 axios 请求,需要添加以下配置:

{
"CorsAccessorSettings": {
"WithExposedHeaders": ["access-token","x-access-token"]
}
}

另外请求设置 withCredentials: false 即可。

16.7 使用 $.ajax 前端注意事项#

使用 Jquery 前端请求可以参考以下配置:

$.ajax({
       url: "http://localhost:8080/getdata",
       type: "GET",
       xhrFields: {
           withCredentials: true
       },
       crossDomain: true,
       success: function (res) {
           render(res);
       }
});

16.7 反馈与建议#

与我们交流

给 Furion 提 Issue


了解更多

想了解更多 跨域请求 知识可查阅 ASP.NET Core - 启用跨域请求 章节。

Last updated on by Monk
- + diff --git a/handbook/build/docs/dapper/index.html b/handbook/build/docs/dapper/index.html index d4dd8090a36..a7b625d7d5b 100644 --- a/handbook/build/docs/dapper/index.html +++ b/handbook/build/docs/dapper/index.html @@ -8,7 +8,7 @@ 10.2. Dapper 集成 | Furion - + @@ -33,7 +33,7 @@
while (reader.Read())
{
IShape shape;
var type = (ShapeType)reader.GetInt32(typeColumnIndex);
switch (type)
{
case ShapeType.Circle:
shape = circleParser(reader);
break;
case ShapeType.Square:
shape = squareParser(reader);
break;
case ShapeType.Triangle:
shape = triangleParser(reader);
break;
default:
throw new NotImplementedException();
}
shapes.Add(shape);
}
}

10.2.5 反馈与建议#

与我们交流

给 Furion 提 Issue


了解更多

想了解更多 Dapper 知识可查阅 Dapper 官网

Last updated on by Monk
- + diff --git a/handbook/build/docs/data-validation/index.html b/handbook/build/docs/data-validation/index.html index 3fb64ae1edc..dc67c2ff247 100644 --- a/handbook/build/docs/data-validation/index.html +++ b/handbook/build/docs/data-validation/index.html @@ -8,7 +8,7 @@ 8. 数据校验 | Furion - + @@ -75,7 +75,7 @@
namespace Furion.Web.Entry.Controllers
{
[ApiController]
public class MvcController : Controller
{
public IActionResult Index()
{
return View();
}
}
}

8.10 MiniProfiler 查看#

如下图所示:

8.11 多语言支持#

参见 【全球化和本地化(多语言)】 章节

8.12 集成 FluentValidation 第三方校验#

Furion 内置的验证已经可以满足绝大多数校验情况,但是对于 场景 验证目前暂未支持。这里推荐集成 FluentValidation 第三方校验组件。

8.12.1 安装 FluentValidation.AspNetCore 拓展包#

dotnet add package FluentValidation.AspNetCore

8.12.2 在 Startup.cs 中注册#

services.AddControllers()
.AddFluentValidation(fv => {
fv.RegisterValidatorsFromAssemblies(App.Assemblies);
});

8.12.3 使用例子#

public class Person {
public int Id { get; set; }
public string Name { get; set; }
public string Email { get; set; }
public int Age { get; set; }
}
public class PersonValidator : AbstractValidator<Person> {
public PersonValidator() {
RuleFor(x => x.Id).NotNull();
RuleFor(x => x.Name).Length(0, 10);
RuleFor(x => x.Email).EmailAddress();
RuleFor(x => x.Age).InclusiveBetween(18, 60);
}
}

在控制器中使用无需手动调用 ModelState.IsValid 进行判断,Furion 会自动执行该操作。

如需了解更多 FluentValidation 知识可查阅官方文档:https://fluentvalidation.net/

8.13 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by Monk
- + diff --git a/handbook/build/docs/dbcontext-Interceptor/index.html b/handbook/build/docs/dbcontext-Interceptor/index.html index ca9df57e7a3..b85dc4f26cd 100644 --- a/handbook/build/docs/dbcontext-Interceptor/index.html +++ b/handbook/build/docs/dbcontext-Interceptor/index.html @@ -8,7 +8,7 @@ 9.24 数据库操作拦截器 | Furion - + @@ -57,7 +57,7 @@
// 获取所有新增和更新的实体
var entities = dbContext.ChangeTracker.Entries()
.Where(u => u.State == EntityState.Added || u.State == EntityState.Modified);
foreach (var entity in entities)
{
switch (entity.State)
{
// 自动设置租户Id
case EntityState.Added:
entity.Property(nameof(Entity.TenantId)).CurrentValue = GetTenantId();
break;
// 排除租户Id
case EntityState.Modified:
entity.Property(nameof(Entity.TenantId)).IsModified = false;
break;
}
}
}

9.24.3 注册自定义过滤器#

定义好过滤器之后,我们需要在数据库上下文中注册:

services.AddDbPool<FurionDbContext>(interceptors: new IInterceptor[] {
new YourSqlConnectionProfilerInterceptor(),
new YourDbContextSaveChangesInterceptor(),
new YourSqlCommandProfilerInterceptor()
});

9.24.4 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by Monk
- + diff --git a/handbook/build/docs/dbcontext-add-or-update/index.html b/handbook/build/docs/dbcontext-add-or-update/index.html index 5b65894c0c4..4a91341c2d4 100644 --- a/handbook/build/docs/dbcontext-add-or-update/index.html +++ b/handbook/build/docs/dbcontext-add-or-update/index.html @@ -8,7 +8,7 @@ 9.7 新增或更新操作 | Furion - + @@ -100,7 +100,7 @@
// 示例七
await user.InsertOrUpdateExcludeNowAsync(new[] { u=>u.Name, u=>u.Age});
// 示例八
await user.InsertOrUpdateExcludeNowAsync(new[] {"Age", "Name"});

9.5.7 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by Monk
- + diff --git a/handbook/build/docs/dbcontext-add/index.html b/handbook/build/docs/dbcontext-add/index.html index 3c7c7d63f1d..518e296a7b0 100644 --- a/handbook/build/docs/dbcontext-add/index.html +++ b/handbook/build/docs/dbcontext-add/index.html @@ -8,7 +8,7 @@ 9.5 新增操作 | Furion - + @@ -51,7 +51,7 @@
// 示例二
await repository.InsertNowAsync(new List<User> { user, user2 });
// 示例三
await repository.InsertNowAsync(new[] {user, user2 });
小知识

所有带 Now 结尾的表示立即提交到数据库,也就是立即调用 SaveChangesSaveChangesAsync

9.5.5 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by Monk
- + diff --git a/handbook/build/docs/dbcontext-audit/index.html b/handbook/build/docs/dbcontext-audit/index.html index be02824f245..f01958e4199 100644 --- a/handbook/build/docs/dbcontext-audit/index.html +++ b/handbook/build/docs/dbcontext-audit/index.html @@ -8,7 +8,7 @@ 9.22 审计日志 | Furion - + @@ -61,7 +61,7 @@
// 判断是否请求成功,没有异常就是请求成功
var isRequestSucceed = actionContext.Exception == null;
// 这里写入日志~~~~~~~~~~~~~~~~~~~~
}
}
}
  1. 注册 RequestAuditFilter 筛选器
services.AddMvcFilter<RequestAuditFilter>();
关于筛选器注册顺序

通常先注册的会先执行,也可以通过实现 IOrderedFilter 接口配置 Order 属性,数值越小,越先执行。

9.22.4 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by sourcehome
- + diff --git a/handbook/build/docs/dbcontext-batch/index.html b/handbook/build/docs/dbcontext-batch/index.html index 62d20e90a55..2a79e3f1f45 100644 --- a/handbook/build/docs/dbcontext-batch/index.html +++ b/handbook/build/docs/dbcontext-batch/index.html @@ -8,7 +8,7 @@ 9.9 批量操作 | Furion - + @@ -30,7 +30,7 @@
// 根据条件批量更新
repository.Where(a => a.ItemId <= 500).BatchUpdate(a => new Item { Quantity = a.Quantity + 100 });
repository.Where(a => a.ItemId <= 500).BatchUpdate(new Item { Description = "Updated" });
await repository.Where(a => a.ItemId <= 500).BatchUpdateAsync(new Item { Description = "Updated" });
// 批量更新指定列
var updateColumns = new List<string> { nameof(Item.Quantity) };
var q = repository.Where(a => a.ItemId <= 500);
int affected = q.BatchUpdate(new Item { Description = "Updated" }, updateColumns);

9.9.3 批量操作性能#

Operations\Rows100,000 EF100,000 EFBulk1,000,000 EFBulk
Insert38.98 s2.10 s17.99 s
Update109.25 s3.96 s31.45 s
Delete7.26 s2.04 s12.18 s
---------------------------------------------------------------
Together70.70 s5.88 s56.84 s

9.9.4 反馈与建议#

与我们交流

给 Furion 提 Issue


了解更多

想了解更多 EFCore.BulkExtensions 知识可查阅 EFCore.BulkExtensions 开源仓库

Last updated on by Monk
- + diff --git a/handbook/build/docs/dbcontext-code-first/index.html b/handbook/build/docs/dbcontext-code-first/index.html index 38c7a4ab2f2..a8a90f42c39 100644 --- a/handbook/build/docs/dbcontext-code-first/index.html +++ b/handbook/build/docs/dbcontext-code-first/index.html @@ -8,7 +8,7 @@ 9.20 模型生成数据库 | Furion - + @@ -26,7 +26,7 @@
/// <summary>
/// 年龄
/// </summary>
public int Age { get; set; }
/// <summary>
/// 住址
/// </summary>
public string Address { get; set; }
}
}
实体约定

所有数据库实体必须直接或间接继承 IEntity 接口。

9.20.2.2 打开 程序包管理控制台#

9.20.2.3 切换默认项目#

程序包管理控制台 默认项目设置为 Furion.Database.Migrations

9.20.2.4 创建模型版本#

Add-Migration v1.0.0
特别说明

v1.0.0 是此处数据库更改的版本号,可以写任何字符串,但推荐写版本号,每次 +1

最终命令如下:

PM> Add-Migration v1.0.0
Build started...
Build succeeded.
Microsoft.EntityFrameworkCore.Model.Validation[10400]
Sensitive data logging is enabled. Log entries and exception messages may include sensitive application data, this mode should only be enabled during development.
Microsoft.EntityFrameworkCore.Infrastructure[10403]
Entity Framework Core 5.0.0-rc.1.20451.13 initialized 'FurionDbContext' using provider 'Microsoft.EntityFrameworkCore.Sqlite' with options: SensitiveDataLoggingEnabled DetailedErrorsEnabled MaxPoolSize=100 MigrationsAssembly=Furion.Database.Migrations
To undo this action, use Remove-Migration.
PM>

生成成功后,Furion.Database.Migrations 项目下会新增 Migrations 文件夹(如果没有),同时本次的架构生成文件,如:

9.20.2.5 更新到数据库#

Update-Database

执行该命令后,数据库就会自动根据模型生成对应的表。

小知识

如果 Update-Database 后面带字符串参数,则会自动还原数据库到指定版本,如:

Update-Database v0.0.3

将数据库还原到 v0.0.3 版本

9.20.3 更新模型#

如果模型改变了,重复上面操作即可,如:

Add-Migration v1.0.1
Update-Database

9.20.4 导出 Sql#

有些时候,我们没有直接更新数据库的权限,或者怕出问题,我们都会先生成 Sql 看看,这时候只需要通过 Script-Migration 导出即可,如:

Script-Migration

9.20.5 VS Code 方式#

9.20.5.1 安装 dotnet ef#

dotnet tool install --global dotnet-ef --version 5.0.0-rc.2.20475.6

9.20.5.2 cd 目录#

通过 VS Code 打开 .sln 所在的目录,如:framework

之后进入 Furion.Database.Migrations 目录

cd Furion.Database.Migrations

9.20.5.3 执行命令#

dotnet ef migrations add v1.0.0 -s "../Furion.Web.Entry"
dotnet ef database update -s "../Furion.Web.Entry"

9.20.6 反馈与建议#

与我们交流

给 Furion 提 Issue


了解更多

想了解更多 正向工厂 知识可查阅 EF Core - 管理数据库架构 章节。

Last updated on by engallon
- + diff --git a/handbook/build/docs/dbcontext-db-first/index.html b/handbook/build/docs/dbcontext-db-first/index.html index ffe308fa746..714d9c565a0 100644 --- a/handbook/build/docs/dbcontext-db-first/index.html +++ b/handbook/build/docs/dbcontext-db-first/index.html @@ -8,7 +8,7 @@ 9.19 数据库生成模型 | Furion - + @@ -59,7 +59,7 @@
}
}
Furion Tools v1.0.0 全部实体生成成功!
PM>

9.19.4 命令参数配置#

Furion Tools Cli 支持多个参数配置,使用方法只需要在命令后面添加即可,如:

&"../tools/cli.ps1" -Context 数据库上下文名 -ConnectionName 连接字符串Key

支持参数如下:

  • -Tables:配置要生成的数据库表,数组类型,如果为空,则生成数据库所有表和视图。如:-Tables Person,PersonDetails
  • -Context:配置数据库上下文,默认 FurionDbContext,如果有多个数据库上下文,则此参数必须配置
  • -ConnectionName:配置数据库连接字符串,对应 appsetting.json 中的 Key
  • -OutputDir:生成实体代码输出目录,默认为:./Furion.Core/Entities/
  • -DbProvider:数据库提供器,默认是 Microsoft.EntityFrameworkCore.SqlServer,其他数据库请指定对应程序集
    • SqlServerMicrosoft.EntityFrameworkCore.SqlServer
    • SqliteMicrosoft.EntityFrameworkCore.Sqlite
    • CosmosMicrosoft.EntityFrameworkCore.Cosmos
    • InMemoryDatabaseMicrosoft.EntityFrameworkCore.InMemory
    • MySqlPomelo.EntityFrameworkCore.MySql
    • PostgreSQLNpgsql.EntityFrameworkCore.PostgreSQL
    • OracleOracle.EntityFrameworkCore
    • DmMicrosoft.EntityFrameworkCore.Dm
  • -EntryProject:Web 启用项目层名,默认 Furion.Web.Entry
  • -CoreProject:实体项目层名,默认 Furion.Core
  • -DbContextLocators:多数据库上下文定位器,默认 MasterDbContextLocator,支持多个,如:MasterDbContextLocator,MySqlDbContextLocator
  • -Product:解决方案默认前缀,如 Furion
  • -UseDatabaseNames:是否保持生成和数据库、表一致的名称
  • -Namespace:指定实体命名空间

9.19.5 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by Monk
- + diff --git a/handbook/build/docs/dbcontext-delete/index.html b/handbook/build/docs/dbcontext-delete/index.html index 294dfd73885..6662c008dc8 100644 --- a/handbook/build/docs/dbcontext-delete/index.html +++ b/handbook/build/docs/dbcontext-delete/index.html @@ -8,7 +8,7 @@ 9.8 删除操作 | Furion - + @@ -67,7 +67,7 @@
// 示例五
await entity.FakeDeleteAsync();
// 示例六
await repository.UpdateIncludeAsync(user, u => u.IsDeleted);

9.8.8 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by Monk
- + diff --git a/handbook/build/docs/dbcontext-entitytrigger/index.html b/handbook/build/docs/dbcontext-entitytrigger/index.html index 1d48f35c9d2..ef09235ccb4 100644 --- a/handbook/build/docs/dbcontext-entitytrigger/index.html +++ b/handbook/build/docs/dbcontext-entitytrigger/index.html @@ -8,7 +8,7 @@ 9.25. 实体数据监听器 | Furion - + @@ -29,7 +29,7 @@
/// <summary>
/// 监听数据改变之后(仅支持EFCore操作)
/// </summary>
/// <param name="newEntity">新值</param>
/// <param name="oldEntity">旧值</param>
/// <param name="dbContext"></param>
/// <param name="dbContextLocator"></param>
/// <param name="state"></param>
void OnChanged(TEntity newEntity, TEntity oldEntity, DbContext dbContext, Type dbContextLocator, EntityState state);
/// <summary>
/// 监听数据改变失败(仅支持EFCore操作)
/// </summary>
/// <param name="entity"></param>
/// <param name="dbContext"></param>
/// <param name="dbContextLocator"></param>
/// <param name="state"></param>
void OnChangeFailed(TEntity entity, DbContext dbContext, Type dbContextLocator, EntityState state) { }
}

9.29.5 [NotChangedListener] 跳过监听#

默认情况下,Furion 框架会对所有新增、更新、编辑的实体进行监听,有些时候我们无需监听特定实体,只需要在实体上贴 [NotChangedListener] 特性即可。

9.29.6 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by kingling
- + diff --git a/handbook/build/docs/dbcontext-filter/index.html b/handbook/build/docs/dbcontext-filter/index.html index 47192da3601..176660079e7 100644 --- a/handbook/build/docs/dbcontext-filter/index.html +++ b/handbook/build/docs/dbcontext-filter/index.html @@ -8,7 +8,7 @@ 9.23 实体/全局查询筛选器 | Furion - + @@ -34,7 +34,7 @@
// 创建表达式元素
var parameter = Expression.Parameter(metadata.ClrType, "u");
var properyName = Expression.Constant(nameof(Entity.IsDeleted));
var propertyValue = Expression.Constant(false);
// 构建表达式 u => EF.Property<bool>(u, "IsDeleted") == false
var expressionBody = Expression.Equal(Expression.Call(typeof(EF), nameof(EF.Property), new[] { typeof(bool) }, parameter, properyName), propertyValue);
var expression = Expression.Lambda(expressionBody, parameter);
return expression;
}
}
}
小建议

如果对动态构建 LambdaExpression 不熟悉的朋友,可以使用 System.Linq.Dynamic.Corehttps://github.com/zzzprojects/System.Linq.Dynamic.Core

9.23.3 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by Monk
- + diff --git a/handbook/build/docs/dbcontext-function/index.html b/handbook/build/docs/dbcontext-function/index.html index 02c0f18c6fc..fa5cb3c84eb 100644 --- a/handbook/build/docs/dbcontext-function/index.html +++ b/handbook/build/docs/dbcontext-function/index.html @@ -8,7 +8,7 @@ 9.14 函数操作 | Furion - + @@ -46,7 +46,7 @@
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity(typeof(F_Person)).HasNoKey();
modelBuilder.HasDbFunction(() => GetPersons(default));
}
}
}

9.14.5.4 在 Linq 中使用#

IQueryable<F_Person> query = _repository.DynamicDbContext.GetPersons(1);
var result = query.Where(u => u.Name.Equals("Furion")).ToList();

最终生成 Sql

SELECT [g].Id, [g].Name, [g].Age, [g].Address
FROM dbo.GetPersons(1) AS [g]
WHERE [g].Name == N'Furion';

9.14.6 在 EF Core 内置函数#

EF Core 为我们提供了很多常用的内置函数,可以在 Lambda 条件中使用,主要是通过 EF.Functions 调用,如:

_repository.Where(u => EF.Functions.DateDiffHour(u.CreatedDt, DateTime.Now) > 8).FirstOrDefault();

这个语句使用了 EF.Functions.DateDiffHour 最终生成的 Sql 如下:

SELECT TOP(1) [a].*
FROM [dbo].[TEST] AS [a]
WHERE DATEDIFF(HOUR, [a].[CREATED_DT], GETDATE()) > 8

EF Core 内置函数就不一一列出了,可以通过 EF.Functions 查看更多,如果不能满足自己的需求,那么可以自定义 Linq 标量函数

9.14.7 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by Monk
- + diff --git a/handbook/build/docs/dbcontext-hight-query/index.html b/handbook/build/docs/dbcontext-hight-query/index.html index e30798add07..3461bcc98ba 100644 --- a/handbook/build/docs/dbcontext-hight-query/index.html +++ b/handbook/build/docs/dbcontext-hight-query/index.html @@ -8,7 +8,7 @@ 9.11 高级查询操作 | Furion - + @@ -68,7 +68,7 @@
namespace Furion.Core
{
public class Person : Entity, IEntityTypeBuilder<Person>
{
public string Name { get; set; }
/// <summary>
/// 配置实体关系
/// </summary>
/// <param name="entityBuilder"></param>
/// <param name="dbContext"></param>
/// <param name="dbContextLocator"></param>
public void Configure(EntityTypeBuilder<City> entityBuilder, DbContext dbContext, Type dbContextLocator)
{
entityBuilder.ToSqlQuery(
@"select * from dbo.person.2020-09-19
union all
select * from dbo.person.2020-09-20");
}
}
}
var posts = repository.Where(u => u.Id > 10).ToList();

9.11.14 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by Monk
- + diff --git a/handbook/build/docs/dbcontext-locator/index.html b/handbook/build/docs/dbcontext-locator/index.html index de4a57cb1ef..ead55240d49 100644 --- a/handbook/build/docs/dbcontext-locator/index.html +++ b/handbook/build/docs/dbcontext-locator/index.html @@ -8,7 +8,7 @@ 9.2 数据库上下文定位器 | Furion - + @@ -25,7 +25,7 @@
namespace Furion.EntityFramework.Core
{
[AppDbContext("Sqlite3ConnectionString", DbProvider.Sqlite)]
public class DefaultDbContext : AppDbContext<DefaultDbContext> // 无需指定定位器
{
public DefaultDbContext(DbContextOptions<DefaultDbContext> options) : base(options)
{
}
}
}
关于多数据库定位器

默认数据库的定位器默认为 MasterDbContextLocator,所以无需显示指定定位器,但从第二个数据库开始,都必须指定数据库定位器。如:

  • 注册上下文:
options.AddDbPool<OtherDbContext, OtherDbContextLocator>();
  • 定义上下文
using Furion.DatabaseAccessor;
using Microsoft.EntityFrameworkCore;
namespace Furion.EntityFramework.Core
{
[AppDbContext("Sqlite3ConnectionString", DbProvider.Sqlite)]
public class OtherDbContext : AppDbContext<OtherDbContext, OtherDbContextLocator> // 需指定定位器
{
public OtherDbContext(DbContextOptions<OtherDbContext> options) : base(options)
{
}
}
}

另外,Entity/IEntityIRepository 等都需要指定定位器,如:IEntity<TKey, TLocator>IRepository<TEntity, TLocator> 操作。

9.2.5 数据库上下文定位器支持对象#

目前数据库上下文支持以下多个对象:

  • AppDbContext<TEntity, TDbContextLocator>:数据上下文
  • IRepository<TEntity, TDbContextLocator:实体仓储
  • ISqlRepository<TDbContextLocator>: Sql 操作仓储
  • Func<Type, DbContext>:依赖注入获取数据库上下文
  • Entity<Tkey, TDbContextLocator> :实体配置
  • EntityBase<Tkey, TDbContextLocator1, ... TDbContextLocator8>:实体配置
  • EntityNotKey<TDbContextLocator1, ... TDbContextLocator8>:无键实体配置
  • IEntitySeedData<TEntity, TDbContextLocator1, ... TDbContextLocator8>:种子数据配置
  • IEntityTypeBuilder<TEntity, TDbContextLocator1, ... TDbContextLocator8>:实体类型构建器
  • IModelBuilderFilter<TDbContextLocator1, ... TDbContextLocator8>:模型构建筛选器
  • [QueryableFunction(DbContextLocators=Type[])]:查询函数

9.2.6 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by Monk
- + diff --git a/handbook/build/docs/dbcontext-multi-database/index.html b/handbook/build/docs/dbcontext-multi-database/index.html index c620cb4d785..2455b6f1e91 100644 --- a/handbook/build/docs/dbcontext-multi-database/index.html +++ b/handbook/build/docs/dbcontext-multi-database/index.html @@ -8,7 +8,7 @@ 9.18 多数据库操作 | Furion - + @@ -39,7 +39,7 @@
// 支持一个数据库
public class Person: IEntity<MySqlDbContextLocator>
{
// ....
}
// 支持多个数据库
public class Person: IEntity<MySqlDbContextLocator, SqliteDbContextLocator>
{
// ....
}
小知识

所有的 实体依赖接口或抽象类 都支持泛型方式 指定 数据库上下文定位器,最多支持 8 个。

9.18.3.5 Linq 函数方式#

public static class QueryFunctions
{
[QueryableFunction("FN_GetId", "dbo", typeof(MySqlDbContextLocator), typeof(SqliteDbContextLocator))]
public static int GetId(int id) => throw new NotSupportedException();
}

9.18.4 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by 百小僧
- + diff --git a/handbook/build/docs/dbcontext-proc/index.html b/handbook/build/docs/dbcontext-proc/index.html index f12802c0d06..ced79fdb4d7 100644 --- a/handbook/build/docs/dbcontext-proc/index.html +++ b/handbook/build/docs/dbcontext-proc/index.html @@ -8,7 +8,7 @@ 9.13 存储过程操作 | Furion - + @@ -117,7 +117,7 @@
// 获取 RETURN 返回值
var reval = result.ReturnValue;
// 获取返回结果集
var (list1,list2) = result.Result;
关于异步

Furion 框架每一个数据库操作都支持异步方式,由于篇幅有限,就不列举异步方式了。

9.13.3 关于 [DbParameter]#

[DbParameter] 特性是用来标注 Sql函数存储过程 参数的,可配置属性:

  • Direction:设置参数方向,ParameterDirection 枚举类型,默认 ParameterDirection.Input
  • DbType:设置参数类型,DbType 枚举类型,无默认
  • Size:设置参数长度的,int 类型

其中 Direction 属性是默认构造函数参数。

9.13.4 关于 ProcedureOutputResult#

ProcedureOutputResultProcedureOutputResult<TResult> 是复杂存储过程执行返回模型类,有以下属性:

  • OutputValues:多个输出值,ProcedureOutputValue 类型
  • ReturnValue:返回值,object 类型
  • Result:结果集,非泛型版本是 DataSet类型,否则是 泛型类型

9.13.5 存储过程参数#

所有 sql 参数都支持四种方式:

  • DbParameter[]:数组类型
  • new {}:匿名类型
  • new Class{}:强类型类型(支持复杂存储过程参数)
  • Dictionary<string,object> 类型

9.13.6 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by Monk
- + diff --git a/handbook/build/docs/dbcontext-query/index.html b/handbook/build/docs/dbcontext-query/index.html index bc0fc5db7b3..e76874173c8 100644 --- a/handbook/build/docs/dbcontext-query/index.html +++ b/handbook/build/docs/dbcontext-query/index.html @@ -8,7 +8,7 @@ 9.10 查询操作 | Furion - + @@ -134,7 +134,7 @@
// 示例二
_testRepository.Where(u => u.Name.EndWith("Furion"));
// 示例三
_testRepository.Where(u => u.Name.Contains("Furion"));

9.10.6.9 Case When#

数据库中的 Case When 实际上对应的是我们程序中的 三元表达式 ,也就是使用 三元表达式 即可自动生成 Case When 语句。

9.10.7 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by zuohuaijun
- + diff --git a/handbook/build/docs/dbcontext-read-write/index.html b/handbook/build/docs/dbcontext-read-write/index.html index fcd274808c3..d042144597f 100644 --- a/handbook/build/docs/dbcontext-read-write/index.html +++ b/handbook/build/docs/dbcontext-read-write/index.html @@ -8,7 +8,7 @@ 9.27 读写分离/主从复制 | Furion - + @@ -34,7 +34,7 @@
/// <summary>
/// 查询走从库
/// </summary>
/// <returns></returns>
public List<Person> Get()
{
return _msRepository.Slave1<Person>().AsEnumerable();
}
}
}

9.27.3 主从复制#

主从复制:是一种数据备份的方案。

简单来说,是使用两个或两个以上相同的数据库,将一个数据库当做主数据库,而另一个数据库当做从数据库。在主数据库中进行相应操作时,从数据库记录下所有主数据库的操作,使其二者一模一样。

9.27.4 主从复制几种方式#

9.27.4.1 同步复制#

所谓的同步复制,意思是 Master 的变化,必须等待 Slave-1,Slave-2,...,Slave-n 完成后才能返回。 这样,显然不可取,比如,在 Web 前端页面上,用户增加了条记录,需要等待很长时间。

9.27.4.2 异步复制#

如同 AJAX 请求一样。Master 只需要完成自己的数据库操作即可。至于 Slaves 是否收到二进制日志,是否完成操作,不用关心。(推荐方式)

9.27.4.3 半同步复制#

Master 只保证 Slaves 中的一个操作成功,就返回,其他 Slave 不管。

下面将使用 SqlServer 简单配置主从复制功能。

9.27.5 SqlServer 主库配置#

9.27.5.1 添加 本地发布#

9.27.5.2 选择 分发服务器#

9.27.5.3 启用 代理#

9.27.5.4 发布数据库#

9.27.5.5 快照发布#

具体选择何种发布类型,视具体业务场景而定。

9.27.5.6 选择发布项目#

9.27.5.7 配置分发计划#

9.27.5.8 配置安全设置#

9.27.5.9 完成配置#

9.27.6 SqlServer 从库配置#

9.27.6.1 添加 本地订阅#

9.27.6.2 选择 分发服务器#

9.27.6.3 选择 分发代理位置#

9.27.6.4 选择 订阅数据库#

9.27.6.5 选择 分发安全设置#

9.27.6.6 选择 同步计划#

9.27.6.7 完成订阅#

9.27.7 分发定义监视#

9.27.8 查看主从复制结果#

特别特性

主从复制有一定迟延性,所以系统设计要有一定“容忍性"。

9.27.9 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by Monk
- + diff --git a/handbook/build/docs/dbcontext-repository/index.html b/handbook/build/docs/dbcontext-repository/index.html index 6f45c8ed457..e04aae40a40 100644 --- a/handbook/build/docs/dbcontext-repository/index.html +++ b/handbook/build/docs/dbcontext-repository/index.html @@ -8,7 +8,7 @@ 9.4 仓储模式 | Furion - + @@ -30,7 +30,7 @@
ISqlRepository<MsSqlDbContextLocator> mssqlRepository;

动态 sql 方式

"select * from person".Change<MsSqlDbContextLocator>().SqlQuery();

实体配置方式

public class User:Entity<int, MsSqlDbContextLocator, MySqlDbContextLocator>
{
}

Sql 代理方式

[SqlFunction("funcName", DbContextLocator = typeof(MySqlDbContextLocator))]
int GetAge(int id);

Linq 中方式

[QueryableFunction("funcName","dbo", DbContextLocator = typeof(MySqlDbContextLocator))]
string GetName()=> throw Oops.Oh("不支持该数据库操作");

9.4.5 在后台任务中使用#

由于仓储默认注册为 Scoped 生命周期,另外 Furion 暂未提供在后台任务中使用仓储操作。如需操作数据库,可使用:

var dbContext = Db.GetNewDbContext();
// 或
var dbContext2 = Db.GetNewDbContext<TDbContextLocator>();
// 操作 person 表
var person = dbContext.Set<Person>().Find(1);

9.4.6 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by Monk
- + diff --git a/handbook/build/docs/dbcontext-seed-data/index.html b/handbook/build/docs/dbcontext-seed-data/index.html index a8324914d8e..f123973fc3c 100644 --- a/handbook/build/docs/dbcontext-seed-data/index.html +++ b/handbook/build/docs/dbcontext-seed-data/index.html @@ -8,7 +8,7 @@ 9.21 实体种子数据 | Furion - + @@ -28,7 +28,7 @@
namespace Furion.Application
{
public class PersonSeedData : IEntitySeedData<Person>
{
// 配置种子数据
public IEnumerable<Person> HasData(DbContext dbContext, Type dbContextLocator)
{
return new List<Person>
{
new Person { Id = 1, Name = "百小僧", Address = "广东省中山市" },
new Person { Id = 2, Name = "新生帝", Address = "广东省珠海市" }
};
}
}
}

9.21.3 导航属性#

通常我们的实体有 一对多多对多等外键关系,那么我们需要单独为每一个实体添加数据种子,而不是直接写在主表中。

9.21.4 多个数据库种子数据#

Furion 提供泛型的方式支持多个数据库种子数据设定,如:

using Furion.DatabaseAccessor;
using System.Collections.Generic;
namespace Furion.Application
{
public class PersonSeedData : IEntitySeedData<Person, MySqlDbContextLocator, SqliteDbContextLocator>
{
// 配置种子数据
public IEnumerable<Person> HasData(DbContext dbContext, Type dbContextLocator)
{
return new List<Person>
{
new Person { Id = 1, Name = "百小僧", Address = "广东省中山市" },
new Person { Id = 2, Name = "新生帝", Address = "广东省珠海市" }
};
}
}
}

上面的例子表示同时为 MySqlDbContextSqliteDbContext 创建种子数据。

9.21.5 反馈与建议#

与我们交流

给 Furion 提 Issue


了解更多

想了解更多 数据种子 知识可查阅 EF Core - 数据种子设定 章节。

Last updated on by Monk
- + diff --git a/handbook/build/docs/dbcontext-sql-proxy/index.html b/handbook/build/docs/dbcontext-sql-proxy/index.html index a5783acdff2..f0322bba611 100644 --- a/handbook/build/docs/dbcontext-sql-proxy/index.html +++ b/handbook/build/docs/dbcontext-sql-proxy/index.html @@ -8,7 +8,7 @@ 9.17 Sql 高级代理 | Furion - + @@ -72,7 +72,7 @@
namespace Furion.Application
{
public interface ISql : ISqlDispatchProxy
{
[SqlFunction("FN_Name")] // 标量函数
string GetValue(MyParam dto);
[SqlProcedure("FN_Name")] // 表值函数
List<Person> GetPersons(int id);
}
}
补充说明

Sql 代理会自动判断返回值然后自动执行特定函数类型。

9.17.6 为什么用它?#

通过上面的例子大家就可以了解,这种方式操作 sql 非常简单,而且极易维护。大家不用去关心返回值,关心用哪个方法,所有东西会自动给你处理好。

所以,如果需要用 Sql 操作,推荐使用 Sql 高级代理。

9.17.7 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by AiGlory
- + diff --git a/handbook/build/docs/dbcontext-sql-template/index.html b/handbook/build/docs/dbcontext-sql-template/index.html index a0382fc2138..476c2603cc7 100644 --- a/handbook/build/docs/dbcontext-sql-template/index.html +++ b/handbook/build/docs/dbcontext-sql-template/index.html @@ -8,7 +8,7 @@ 9.16 Sql 模板 | Furion - + @@ -24,7 +24,7 @@
// 懒人方式
var users = "#(Select.User)".SqlQuery<User>(new { id = 1});
// Sql 代理方式
[SqlExecute("#(Select.User)")]
List<User> GetUser(int id);

9.16.3.2 高级嵌套#

var users = repository.SqlQuery<User>(
@"select * from user u
left join #(User.Detail) d on u.Id = d.UserId
where id > @id");

9.16.4 Sql 模板配置#

9.16.4.1 普通模式#

{
"Select.User": "select * from User"
}

9.16.4.2 更多配置#

{
"Select.User": {
"Sql": "select * from User where id > @id and Name = @name",
"Params": [
{
"Name": " Id",
"Value": "1",
"DbType": "Int16",
"Size": 10
},
{
"Name": " Name",
"Value": "百小僧",
"DbType": "String",
"Size": 10
}
]
}
}

9.16.5 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by Monk
- + diff --git a/handbook/build/docs/dbcontext-sql/index.html b/handbook/build/docs/dbcontext-sql/index.html index f7d9352029f..6180d8ef679 100644 --- a/handbook/build/docs/dbcontext-sql/index.html +++ b/handbook/build/docs/dbcontext-sql/index.html @@ -8,7 +8,7 @@ 9.15 Sql 操作 | Furion - + @@ -169,7 +169,7 @@
// 不再举例子。。。
补充说明

不管是哪种方式操作 Sql ,方法名参数都是一致的,如:

  • SqlQuery
  • SqlQueryAsync
  • SqlQueries
  • SqlQueriesAsync
  • SqlNonQuery
  • SqlNonQueryAsync
  • SqlScalar
  • SqlScalarAsync
  • SqlProcedureQuery
  • SqlProcedureQueryAsync
  • SqlProcedureQueries
  • SqlProcedureQueriesAsync
  • SqlProcedureScalar
  • SqlProcedureScalarAsync
  • SqlProcedureNonQuery
  • SqlProcedureNonQueryAsync
  • SqlProcedureOutput
  • SqlProcedureOutputAsync
  • SqlFunctionScalar
  • SqlFunctionScalarAsync
  • SqlFunctionQuery
  • SqlFunctionQuery

9.15.6 IRepository 操作#

IRepository 也能操作 sql,调用方法也是和上面一致的,如:

var dataTable = repository.Sql().SqlQuery("select * from person");
特别说明

由于篇幅有限,不再列举所有例子。

9.15.7 IRepository<TEntity> 操作#

IRepository<TEntity> 也能操作 sql,调用方法也是和上面一致的,如:

var dataTable = personRepository.SqlQuery("select * from person");
特别说明

由于篇幅有限,不再列举所有例子。

9.15.8 关于 Sql 参数#

所有 sql存储过程函数 参数都支持四种方式:

  • DbParameter[]:数组类型
  • new {}:匿名类型
  • new Class{}:强类型类型(支持复杂存储过程参数)
  • Dictionary<string,object> 类型
小知识

建议除了复杂的存储过程(带 OUTPUT/RETURN)的以外,所有参数建议使用 new {} 匿名类型,如果需要动态参数,则可以使用 Dictionary<string,object> 类型。

9.15.9 多数据库 Sql 操作 💯 💛#

Furion 框架拥有非常灵活的多数据库操作方式,只需通过多数据库上下文定位器即可动态切换数据库。

9.15.9.1 懒人无敌 🐮 方式#

var dataTable = "select * from person".Change<MySqlDbContextLocator>().SqlQuery();
var persons = "select * from person whre id > @id".Change<SqliteDbContextLocator>().SqlQuery<Person>();
补充说明

懒人方式 只需要通过 Change<TDbContextLocator> 方式即可动态切换数据库。

9.15.9.2 ISqlRepository 方式#

只需要通过 ISqlRepository<TDbContextLocator> 注入或通过 sqlRepository.Change<TDbContextLocator>() 切换。

9.15.9.3 IRepository 方式#

只需要通过 repository.Change<TDbContextLocator>() 获取即可。

9.15.9.4 IRepository<TEntity> 方式#

只需要通过 IRepository<TEntity, TDbContextLocator> 注入或通过 personRepository.Change<TEntity, TDbContextLocator>() 切换。

9.15.10 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by Monk
- + diff --git a/handbook/build/docs/dbcontext-start/index.html b/handbook/build/docs/dbcontext-start/index.html index 142a340e185..e966b1e9bff 100644 --- a/handbook/build/docs/dbcontext-start/index.html +++ b/handbook/build/docs/dbcontext-start/index.html @@ -8,7 +8,7 @@ 9.0 入门简要 | Furion - + @@ -27,7 +27,7 @@
namespace Furion.EntityFramework.Core
{
[AppStartup(600)]
public sealed class FurEntityFrameworkCoreStartup : AppStartup
{
public void ConfigureServices(IServiceCollection services)
{
// 配置数据库上下文,支持N个数据库
services.AddDatabaseAccessor(options =>
{
// 配置默认数据库
options.AddDbPool<FurionDbContext>(DbProvider.SqlServer, connectionString:"连接字符串");
// 配置多个数据库,多个数据库必须指定数据库上下文定位器
options.AddDbPool<SqliteDbContext, SqliteDbContextLocaotr>(DbProvider.Sqlite, connectionString:"连接字符串");
});
}
}
}
新版 MySQL 注意

MySQL 在新版本包中注册有所修改,所以注册方式为:

services.AddDatabaseAccessor(options =>
{
options.AddDbPool<FurionDbContext>($"{DbProvider.MySql}@8.0.22");
});

9.0.1.5 Code First 说明#

特别注意

Furion 框架默认数据迁移的程序集为:Furion.Database.Migrations,所以如果您改了程序集名称或通过 Nuget 方式安装的 Furion 包,则需要配置迁移程序集名称:

services.AddDatabaseAccessor(options =>
{
options.AddDbPool<FurionDbContext>(DbProvider.Sqlite);
}, "自定义迁移名称");

另外,如果应用中配置了多个数据库上下文,那么所有的 迁移命令 都需要指定 -Context 数据库上下文名称 参数。如:

Add-Migration v1.0.0 -Context FurionDbContext

9.0.2 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by Monk
- + diff --git a/handbook/build/docs/dbcontext-update/index.html b/handbook/build/docs/dbcontext-update/index.html index c45171efbbc..5ef8d7f49f0 100644 --- a/handbook/build/docs/dbcontext-update/index.html +++ b/handbook/build/docs/dbcontext-update/index.html @@ -8,7 +8,7 @@ 9.6 更新操作 | Furion - + @@ -170,7 +170,7 @@
// 示例二
await repository.UpdateNowAsync(new List<User> { user, user2 });
// 示例三
await repository.UpdateNowAsync(new[] {user, user2 });
小知识

所有带 Now 结尾的表示立即提交到数据库,也就是立即调用 SaveChangesSaveChangesAsync

9.6.15 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by Monk
- + diff --git a/handbook/build/docs/dbcontext-view/index.html b/handbook/build/docs/dbcontext-view/index.html index 9ef20dbadf4..d7160bc9751 100644 --- a/handbook/build/docs/dbcontext-view/index.html +++ b/handbook/build/docs/dbcontext-view/index.html @@ -8,7 +8,7 @@ 9.12 视图操作 | Furion - + @@ -30,7 +30,7 @@
public FurionService(IRepository<V_Person> repository)
{
// 初始化只读仓储
_readableRepository = repository.Constraint<IReadableRepository<V_Person>>();
}
/// <summary>
/// 读取视图
/// </summary>
/// <returns></returns>
public async Task<List<V_Person>> GetVPerson()
{
var list = await _readableRepository.AsAsyncEnumerable();
return list;
}
}
}
小知识

通过 .Constraint<TEntity,TDbContextLocator> 方法可以将仓储约束为特定仓储,如只读仓储,可读可写仓储,只新增仓储等。

9.12.5 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by Monk
- + diff --git a/handbook/build/docs/dbcontext/index.html b/handbook/build/docs/dbcontext/index.html index 3dae7789879..cd3169fb744 100644 --- a/handbook/build/docs/dbcontext/index.html +++ b/handbook/build/docs/dbcontext/index.html @@ -8,7 +8,7 @@ 9.1 数据库上下文 | Furion - + @@ -34,7 +34,7 @@
options.AddDbPool<ThirdDbContext, ThirdDbContextDbContextLocator>(DbProvider.SqlServer); // 第三个数据库

9.1.8 动态数据库上下文对象#

Furion 框架中,数据库上下文是定义在 Furion.EntityFramework.Core 项目层,并且该层不被 Furion.ApplicationFurion.Core 等层引用。

所以就不能直接在 Furion.Application 项目层直接使用 Furion.EntityFramework.Core 定义的数据库上下文。

Furion 为了解决这个问题,提供了两种方式处理:

  • respository.Context :当前数据库上下文对象,返回是 DbContext 抽象类型
  • respository.DynamicContext:当前数据库上下文对象,返回的是 dynamic 类型

如果你只是想使用 DbContext 的功能,直接使用 respository.Context 即可,如:

respository.Context.SaveChanges();

如果你想能够获取具体的数据库上下文类型,如 MyDbContext,那么使用 respository.DynamicContext 就可以获取到具体的 MyDbContext 类型。如:

var persons = respository.DynamicContext.Persons.Find(1);
var users = respository.DynamicContext.Users;

这样就可以直接操作 MyDbContext 定义的属性和方法了。

9.1.9 在后台任务中使用#

由于 DbContext 默认注册为 Scoped 生存周期,所以在后台任务中使用 DbContext 需通过静态创建方式,如:

using (var dbContext = Db.GetNewDbContext())
{
}
// 或
using(var dbContext2 = Db.GetNewDbContext<TDbContextLocator>())
{
}

9.1.10 反馈与建议#

与我们交流

给 Furion 提 Issue


了解更多

想了解更多 数据库上下文 知识可查阅 EF Core - 配置 DbContext 章节。

Last updated on by Monk
- + diff --git a/handbook/build/docs/dependency-injection/index.html b/handbook/build/docs/dependency-injection/index.html index 0cecac89c74..409738bcacf 100644 --- a/handbook/build/docs/dependency-injection/index.html +++ b/handbook/build/docs/dependency-injection/index.html @@ -8,7 +8,7 @@ 12. 依赖注入/控制反转 | Furion - + @@ -63,7 +63,7 @@
return result;
}
}
}

之后我们只需要为 TestService 增加 [Injection] 特性即可,如:

[Injection(Proxy = typeof(LogDispatchProxy))]
public class TestService: ITestService, ITransient
{
public string SayHello(string word)
{
return $"Hello {word}";
}
}

之后 SayHello 方法被调用的时候就可以实现动态拦截了,比如这里写日志。

12.12.1 全局Aop拦截#

Furion 框架也提供了全局拦截的方式,只需要将 IDispatchProxy 修改为 IGlobalDispatchProxy 即可。

using Furion;
using System.Reflection;
namespace Furion.Application
{
public class LogDispatchProxy : AspectDispatchProxy, IGlobalDispatchProxy
{
// ....
}
}

这样就会拦截所有的 Service,当然也可以通过给特定类贴 [SkipProxy] 跳过全局拦截操作。

拦截优先级

[SkipProxy] > [Injection(Proxy = typeof(LogDispatchProxy))] > 全局拦截

12.12.2 AOP 注入解析服务#

Furion 框架未提供 Proxy 构造函数注入功能,但是提供了 Services 属性,如果需要解析服务,则可以通过以下方式:

var someServices = Services.GetService<ISomeService>(); // 推荐方式
// 或
var someServices = App.GetService<ISomeService>();

12.12.3 AOP 的作用#

这种面向切面的能力(动态拦截/代理)可以实现很多很多功能,如:

  • 动态日志记录
  • 动态修改参数
  • 动态修改返回值
  • 动态方法重定向
  • 动态修改代码逻辑
  • 动态实现异常监听

还可以做更多更多的事情。

12.13 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by 百小僧
- + diff --git a/handbook/build/docs/deploy-docker-auto/index.html b/handbook/build/docs/deploy-docker-auto/index.html index 9711d593c6e..fedd613a5f3 100644 --- a/handbook/build/docs/deploy-docker-auto/index.html +++ b/handbook/build/docs/deploy-docker-auto/index.html @@ -8,7 +8,7 @@ 29.1 Docker 环境持续部署 | Furion - + @@ -57,7 +57,7 @@
#判斷是否存在
CID=$(docker ps | grep "${containerName}" | awk '{print $1}')
echo $CID
if [ "$CID" != "" ];then
docker stop ${containerName}
docker rm ${containerName}
docker rmi ${containerName}
#docker stop $CID
#docker rm $CID
fi
cd ${webDir}/ && docker build -t ${containerName} .
docker run --name ${containerName} --restart=always -d -p ${port}:${port} --link myredis:myredis -v /etc/localtime:/etc/localtime:ro ${containerName}

这里的逻辑就是解压,然后 Docker 相关。每次构建都是带着版本号来的

29.1.5 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by zuohuaijun
- + diff --git a/handbook/build/docs/deploy-docker/index.html b/handbook/build/docs/deploy-docker/index.html index add9dd2dbc0..c16fb527c25 100644 --- a/handbook/build/docs/deploy-docker/index.html +++ b/handbook/build/docs/deploy-docker/index.html @@ -8,7 +8,7 @@ 28.2 在 Docker 部署 | Furion - + @@ -26,7 +26,7 @@
# Restore And Publish
WORKDIR /source/samples
RUN dotnet restore
RUN dotnet publish -c release -o /app --no-restore
# Run
FROM mcr.microsoft.com/dotnet/aspnet:5.0.1
WORKDIR /app
COPY --from=build /app ./
EXPOSE 80
EXPOSE 443
ENTRYPOINT ["dotnet", "Furion.Web.Entry.dll"]
  • 👉 在 Dockerfile 所在路径构建

接下来的步骤和上述步骤一致,不再重复编写

28.2.3 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by Monk
- + diff --git a/handbook/build/docs/deploy-iis/index.html b/handbook/build/docs/deploy-iis/index.html index 2c6a5a93316..f62a6b2ebbf 100644 --- a/handbook/build/docs/deploy-iis/index.html +++ b/handbook/build/docs/deploy-iis/index.html @@ -8,7 +8,7 @@ 28.1 在 IIS 部署 | Furion - + @@ -22,7 +22,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

28.1 在 IIS 部署

28.1.1 发布网站#

28.1.1.1 选择启动项发布#

28.1.1.2 选择发布到文件夹#

28.1.1.3 配置发布后路径#

28.1.1.4 点击发布#

28.1.2 服务器环境配置#

28.1.2.1 第一步#

安装.NET Core 运行时捆绑包:点击下载

28.1.2.2 第二步(命令)#

net stop was /y

28.1.2.3 第三步(命令)#

net start w3svc

28.1.2.4 第四步(命令)#

set ASPNETCORE_ENVIRONMENT=Production

28.1.3 部署到 IIS#

28.1.3.1 添加新网站#

28.1.3.2 配置网站信息#

28.1.3.3 配置应用程序池#

28.1.3.4 设置为 非托管#

28.1.3.5 重启网站#

只需重启网站或应用程序池即可。

28.1.4 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by Monk
- + diff --git a/handbook/build/docs/deploy-nginx/index.html b/handbook/build/docs/deploy-nginx/index.html index c6f3e36952b..35c257989ef 100644 --- a/handbook/build/docs/deploy-nginx/index.html +++ b/handbook/build/docs/deploy-nginx/index.html @@ -8,7 +8,7 @@ 28.3 在 Nginx 部署 | Furion - + @@ -22,7 +22,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️
- + diff --git a/handbook/build/docs/devops/index.html b/handbook/build/docs/devops/index.html index a474d3404c6..5f33025e367 100644 --- a/handbook/build/docs/devops/index.html +++ b/handbook/build/docs/devops/index.html @@ -8,7 +8,7 @@ 29.2 持续部署集成 | Furion - + @@ -22,7 +22,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️
- + diff --git a/handbook/build/docs/donate/index.html b/handbook/build/docs/donate/index.html index 2a8a9141a03..e2ec7d17da2 100644 --- a/handbook/build/docs/donate/index.html +++ b/handbook/build/docs/donate/index.html @@ -8,7 +8,7 @@ 1.5 赞助 Furion | Furion - + @@ -22,7 +22,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

1.5 赞助 Furion

如果想成为 Furion 支持者或赞助商,请考虑:

🍍 赞助列表#

注:排序按赞助顺序书写

赞助人昵称赞助金额(元)附语
🤴 爱吃油麦菜100感谢您的开源项目!
👳‍♂️ 麦壳饼200感谢您的开源项目!
👨 Sun100感谢您的开源项目!
👶 d61761720感谢您的开源项目!
👦 Diqiguoji00816.66见贤思齐
👲 nodyang100感谢您的开源项目!
👳‍♀️ mictxd100吹过的牛都实现。
🧓 欧流全10希望将来超越 Spring
👨‍⚕️ lionkon10...看了框架感觉拿来学习是很不错的...
😤 好人!10Nice 的小僧,我们的 dotnetchina 马上火起来了
😮 木木 Woody10感谢您的开源项目!
😚 Joker HouQQ 超级会员一个月
🤠 ccdfzQQ 专属红包 199
🌝 天夫李总支付宝 6666Furion 非常有意思,持续关注
😝 六尘子微信红包 199公司已经使用,小小敬意
🤠 ccdfzQQ 专属红包 200赞助一根内存条
🤑 邓亮灯28.88感谢您的开源项目!
😬 天道酬勤微信二维码 188小小心意
🥰 却月居士QQ 专属红包 100恭喜发财
🤩 鲁旭100感谢您的开源项目!
😬 散客行微信二维码 666终于找到一个不错的框架
😌 本心100项目功能很强大
🙆‍♂️ 毕业生100请你喝杯咖啡
🦹‍♀️ 猪鼻子微信二维码 668
🧟‍♂️ 明年·今日200使用的框架里最爽的,最理想的!加油
👨‍🎓 过去的过去50感谢您的开源项目!
👨‍🔧 万里兮100新公司的第一个项目从 Furion 开始
👴 Muphalem20很热心很亲切的开发者,加油!
💂‍♂️ 吃锅巴的码农微信二维码 500就冲你的文档写得好!
🤴 三重罗生门微信红包 200下次烤鱼你请!
🤵 李涛10加油,我们看到了 dotnet 美好的明天 :)
😂 !@#$%^&QQ 专属红包 100刚接触 furion,文档真棒
😵 李斌20看到一个不错的框架,学习学习,感谢作者的无私奉献
😞 逞强QQ 专属红包 20恭喜发财
🤒 顾锦松QQ 专属红包 200期待文档完成时候
🧟‍♀️ 哈哈微信赞赏码 1000点赞作者!
🍍 Z微信赞赏码 100恭喜孩子诞生,谢谢大佬
🍲 海涛50恭喜
😣 h微信赞赏码 100qq82683656
👱‍♀️ 冷大大微信赞赏码 100加快文档和教学补充哦,另外需要钉钉群,平常不用 QQ
👜 腾坤微信赞赏码 10感谢您的开源项目,QQ:565728589
🚆 文耶耶微信赞赏码 10很棒
🎟 Cynthiax微信转账 5000一路看着过来,小小心意
🥴 一花一世界微信赞赏码 10感谢开源,感谢持续更新
🥪 。微信赞赏码 2感谢
🎄微信赞赏码 20感谢你的开源项目
🍖 班卓微信赞赏码 9.9新年快乐
🥖 雨天裸奔的猫微信赞赏码 10加油!好东西,期待更多新特性
🍖 班卓微信赞赏码 9.9加个鸡腿
🍘 Egota Tiya微信赞赏码 6.66真的不错,准备使用这个框架
🤩 李氏天下微信赞赏码 200坚持下去
🎗 Trube微信赞赏码 200感恩
🧦 不长胡子的毛微信赞赏码 100Fur
👓 醉酒码农微信赞赏码 1000单次只能赞助 200,捐赠 5 次,支持 Furion
😢 XIUXIN微信赞赏码 20谢大佬,春天里的第一杯奶茶
👩‍🦳 吴鹏微信赞赏码 100感谢这么好的框架和文档
🧔 SymmmeeQQ 专属红包 20太牛了
🤴 隐居~~~QQ 专属红包 100支持一下吧
👵 饭粥微信赞赏码 666666666666
🎭 Free微信赞赏码 20感谢开源。比较敬业的架构师,支持一下
👑 时不待我微信赞赏码 50请你喝咖啡
😋 Eway5微信赞赏码 99找 abp 搜到 Furion 的,没想到国内有这么优秀的贡献者

非常感谢您们的支持,正是因为您们,中国开源才可以越走越远,Furion 越走越远。

Last updated on by 百小僧
- + diff --git a/handbook/build/docs/dynamic-api-controller/index.html b/handbook/build/docs/dynamic-api-controller/index.html index d042bbac224..7f9f88e0956 100644 --- a/handbook/build/docs/dynamic-api-controller/index.html +++ b/handbook/build/docs/dynamic-api-controller/index.html @@ -8,7 +8,7 @@ 5. 动态 WebAPI | Furion - + @@ -82,7 +82,7 @@
// 异常拦截
if(resultContext.Exception != null)
{
}
}
}

详细用法可参见 ASP.NET Core 5.0 - 筛选器

5.12 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by Monk
- + diff --git a/handbook/build/docs/encryption/index.html b/handbook/build/docs/encryption/index.html index 3de0bcffbd3..e5317f8bd19 100644 --- a/handbook/build/docs/encryption/index.html +++ b/handbook/build/docs/encryption/index.html @@ -8,7 +8,7 @@ 20. 数据加解密 | Furion - + @@ -28,7 +28,7 @@
// AES加解密
var s = "Furion".ToAESEncrypt("sfdsfdsfdsfdsfdsfdsfdsfdsfdfdsfdsfdfdfdfd");
var str = s.ToToAESDecrypt("sfdsfdsfdsfdsfdsfdsfdsfdsfdfdsfdsfdfdfdfd");
// DESC 加解密
var s = "Furion".ToDESCEncrypt("sfdsfdsfdsfdsfdsfdsfdsfdsfdfdsfdsfdfdfdfd");
var str = s.ToDESCDecrypt("sfdsfdsfdsfdsfdsfdsfdsfdsfdfdsfdsfdfdfdfd");

20.4 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by Monk
- + diff --git a/handbook/build/docs/entity/index.html b/handbook/build/docs/entity/index.html index 39118591cd2..92148f0603b 100644 --- a/handbook/build/docs/entity/index.html +++ b/handbook/build/docs/entity/index.html @@ -8,7 +8,7 @@ 9.3 数据库实体 | Furion - + @@ -48,7 +48,7 @@
// 配置数据库实体
public void Configure(EntityTypeBuilder<User> entityBuilder, DbContext dbContext, Type dbContextLocator)
{
entityBuilder.HasKey(u => u.Id);
entityBuilder.HasIndex(u => u.Name);
}
}
}

9.3.4.2 在任何实例类中配置#

using Furion.DatabaseAccessor;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using System;
namespace Furion.Core
{
public class SomeClass : IEntityTypeBuilder<User>
{
public void Configure(EntityTypeBuilder<User> entityBuilder, DbContext dbContext, Type dbContextLocator)
{
entityBuilder.HasKey(u => u.Id);
entityBuilder.HasIndex(u => u.Name);
}
}
}

如上面例子,通过 SomeClass 配置 User 数据库实体。

更多知识

如需了解实体配置支持哪些配置可查阅 【EFCore - 创建模型】 章节。

9.3.5 数据库实体配置说明#

Furion 框架会自动扫描所有继承 IEntity 接口的类进行 DbSet<TEntity> 注册,也就是实现自动配置 DbContextOnModelCreating

如果需要跳过自动注册,只需要贴 [NonAutomatic][SkipScan] 特性即可。一旦贴了此特性,那么就需要手动配置 DbContextOnModelCreating

9.3.6 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by 百小僧
- + diff --git a/handbook/build/docs/event-bus/index.html b/handbook/build/docs/event-bus/index.html index 5a086c6b474..458a1b6edfe 100644 --- a/handbook/build/docs/event-bus/index.html +++ b/handbook/build/docs/event-bus/index.html @@ -8,7 +8,7 @@ 22. 事件总线 | Furion - + @@ -24,7 +24,7 @@
// 多条消息共用同一个处理程序
[SubscribeMessage("delete:user")]
[SubscribeMessage("remove:user")]
public void RemoveUser(string eventId, object payload)
{
Console.WriteLine("我是"+eventId);
}
}

22.2.3 发布消息#

定义好订阅处理程序后,我们就可以在程序任何地方进行广播消息,事件总线会自动根据 消息 Id 触发对应的处理程序方法:

MessageCenter.Send("create:user", new User {}); // => 打印:我是create:user
MessageCenter.Send("delete:user", new User {}); // => 打印:我是delete:user
MessageCenter.Send("remove:user", new User {}); // => 打印:我是remove:user

22.2.4 直接订阅消息#

在上面的例子中,我们需要创建 ISubscribeHandler 的派生类进行相关配置才能实现订阅处理。

在某些特殊情况下,可能只需要订阅一次即可。所以,在 Furion 框架中,为了更简便的订阅消息,也提供了 MessageCenter.Subscribe<T> 静态方法,如:

MessageCenter.Subscribe<User>("create:user", (i,p) => {
// do something。。。
});

22.3 MediatR#

Furion 框架默认只实现了轻量级的事件总线机制,可能还远远未达到大型项目和高并发数据的处理需求。

这个时候,推荐使用 MediatR 这个第三方库进行处理,Github 地址:https://github.com/jbogard/MediatR

MediatR 是非常优秀的事件总线库,支持单播、多播、消息通知推送、智能调度等操作,非常小巧。

22.3.1 MediatR 使用文档#

https://github.com/jbogard/MediatR/wiki

22.4 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by Monk
- + diff --git a/handbook/build/docs/friendly-exception/index.html b/handbook/build/docs/friendly-exception/index.html index bf41136160c..98a26e140cb 100644 --- a/handbook/build/docs/friendly-exception/index.html +++ b/handbook/build/docs/friendly-exception/index.html @@ -8,7 +8,7 @@ 7. 友好异常处理 | Furion - + @@ -60,7 +60,7 @@
namespace Furion.Application
{
public class LogExceptionHandler : IGlobalExceptionHandler, ISingleton
{
public Task OnExceptionAsync(ExceptionContext context)
{
// 写日志
return Task.CompletedTask;
}
}
}

7.15 FriendlyExceptionSettings 配置#

  • HideErrorCode:隐藏错误码,bool 类型,默认 false
  • DefaultErrorCode:默认错误码,string 类型
  • DefaultErrorMessage:默认错误消息,string 类型

配置示例

{
"FriendlyExceptionSettings": {
"DefaultErrorMessage": "系统异常,请联系管理员"
}
}

7.16 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by Monk
- + diff --git a/handbook/build/docs/get-start/index.html b/handbook/build/docs/get-start/index.html index 15523185447..fa9ee67ff83 100644 --- a/handbook/build/docs/get-start/index.html +++ b/handbook/build/docs/get-start/index.html @@ -8,7 +8,7 @@ 2.1 一分钟上手 | Furion - + @@ -33,7 +33,7 @@
// 添加这一行,如果是 MVC和API共存项目,无需添加 string.Empty
app.UseInject(string.Empty);
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
}
}
小提醒

如果 app.UseInject() 不输入参数,则默认地址为 /api,如果输入 string.Empty 则为 / 目录。如果输入任意字符串,则为 /任意字符串 目录。

2.4 启动浏览器#

启动浏览器查看效果。

说好一分钟上手,你们用了多长时间。😁

Last updated on by 百小僧
- + diff --git a/handbook/build/docs/global/app/index.html b/handbook/build/docs/global/app/index.html index f413f77cf36..20722927843 100644 --- a/handbook/build/docs/global/app/index.html +++ b/handbook/build/docs/global/app/index.html @@ -8,7 +8,7 @@ 1. App 静态类 | Furion - + @@ -31,7 +31,7 @@
// 获取进程架构
var processArchitecture = RuntimeInformation.ProcessArchitecture; // => X64
// 是否是64位操作系统
var is64BitOperatingSystem = Environment.Is64BitOperatingSystem; // => True
Last updated on by Monk
- + diff --git a/handbook/build/docs/global/datavalidator/index.html b/handbook/build/docs/global/datavalidator/index.html index 1e1342b431b..76abdab3fca 100644 --- a/handbook/build/docs/global/datavalidator/index.html +++ b/handbook/build/docs/global/datavalidator/index.html @@ -8,7 +8,7 @@ 3. DataValidator 静态类 | Furion - + @@ -23,7 +23,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

3. DataValidator 静态类

3.1 验证对象数据#

var result = DataValidator.TryValidateObject(obj);

3.2 验证单个值#

var result = DataValidator.TryValidateValue(value, typeof(RequiredAttribure), typeof(RangeAttribute));

3.3 正则表达式验证单个值#

var result = DataValidator.TryValidateValue(value,"正则表达式");

3.4 验证类型验证单个值#

var result = DataValidator.TryValidateValue(value, ValidationTypes.Number);
var result2 = DataValidator.TryValidateValue(value, ValidationPattern.AllOfThem, ValidationTypes.Number, ValidationTypes.Required);
Last updated on by Monk
- + diff --git a/handbook/build/docs/global/db/index.html b/handbook/build/docs/global/db/index.html index 783e12d0bef..16f53e86efa 100644 --- a/handbook/build/docs/global/db/index.html +++ b/handbook/build/docs/global/db/index.html @@ -8,7 +8,7 @@ 2. Db 静态类 | Furion - + @@ -22,7 +22,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

2. Db 静态类

2.1 获取非泛型仓储#

var repository = Db.GetRepository();

2.2 获取泛型仓储#

var entityRepository = Db.GetRepository<TEntity>();

2.3 获取带定位器泛型仓储#

var locatorRepository = Db.GetRepository<TEntity, TDbContextLocator>();

2.4 获取 Sql 仓储#

var sqlRepository = Db.GetSqlRepository();

2.5 获取 Sql 定位器仓储#

var sqlLocatorRepository = Db.GetSqlRepository<TDbContextLocator>();

2.6 获取 Sql 代理对象#

var sqlProxy= Db.GetSqlProxy<TSqlDispatchProxy>();

2.7 获取默认数据库上下文#

var dbContext = Db.GetDbContext();

2.7 获取定位器数据库上下文#

var locatorDbContext = Db.GetDbContext<TDbContextLocator>();
var locatorDbContext2 = Db.GetDbContext(typeof(TDbContextLocator));

2.8 创建新的默认数据库上下文#

var dbContext = Db.GetNewDbContext();

2.9 创建新的定位器数据库上下文#

var locatorDbContext = Db.GetNewDbContext<TDbContextLocator>();
var locatorDbContext2 = Db.GetNewDbContext(typeof(TDbContextLocator));
Last updated on by Monk
- + diff --git a/handbook/build/docs/global/json/index.html b/handbook/build/docs/global/json/index.html index 9d1e0319a39..b8fca6c818f 100644 --- a/handbook/build/docs/global/json/index.html +++ b/handbook/build/docs/global/json/index.html @@ -8,7 +8,7 @@ 10. JSON 静态类 | Furion - + @@ -22,7 +22,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️
- + diff --git a/handbook/build/docs/global/jsonserializer/index.html b/handbook/build/docs/global/jsonserializer/index.html index 8d86c81640a..395f8009a04 100644 --- a/handbook/build/docs/global/jsonserializer/index.html +++ b/handbook/build/docs/global/jsonserializer/index.html @@ -8,7 +8,7 @@ 7. JsonSerializerUtility 静态类 | Furion - + @@ -22,7 +22,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

7. JsonSerializerUtility 静态类

重要声明

以下内容在 Furion 1.16.0 + 版本中已移除。请使用 【23. JSON 序列化章节】

7.1 序列化#

var str = JsonSerializerUtility.Serialize(obj, [options]);

7.3 反序列化#

var obj = JsonSerializerUtility.Deserialize<T>(str, [options]);

7.4 获取默认序列化配置#

var options = JsonSerializerUtility.GetDefaultJsonSerializerOptions();

7.5 设置序列化属性首字母大写#

services.AddControllersWithViews()
.AddJsonSerializerPascalPropertyNaming();

7.6 设置时间输出统一格式化#

services.AddControllersWithViews()
.AddDateTimeJsonConverter("yyyy-MM-dd HH:mm:ss");
Last updated on by Monk
- + diff --git a/handbook/build/docs/global/l/index.html b/handbook/build/docs/global/l/index.html index 7031632f94a..8611c86a7c4 100644 --- a/handbook/build/docs/global/l/index.html +++ b/handbook/build/docs/global/l/index.html @@ -8,7 +8,7 @@ 8. L 静态类 | Furion - + @@ -22,7 +22,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

8. L 静态类

8.1 转换文本多语言#

var apiInterface = L.Text["API 接口"];

8.2 转换 Html 多语言#

var name = L.Html["<b>Hello</b><i> {0}</i>", name];

8.3 设置当前语言#

L.SetCulture("en-US");

8.4 获取系统语言列表#

var list = L.GetCultures();

8.5 获取当前选中语言#

var list = L.GetSelectCulture();
Last updated on by Monk
- + diff --git a/handbook/build/docs/global/linqexpression/index.html b/handbook/build/docs/global/linqexpression/index.html index 7a5c5cba663..e722a393f85 100644 --- a/handbook/build/docs/global/linqexpression/index.html +++ b/handbook/build/docs/global/linqexpression/index.html @@ -8,7 +8,7 @@ 5. LinqExpression 静态类 | Furion - + @@ -16,13 +16,15 @@ - +
-
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

5. LinqExpression 静态类

5.1 创建一个表达式#

var expression = LinqExpression.Create<T>(u => u.Id == 1);
var expression2 = LinqExpression.Create<T>((u,i) => u.Id ==1 && i > 0);

5.2 拼接两个表达式#

var expression = LinqExpression.And(expression1, expression2);
var expression2 = LinqExpression.IndexAnd(expression1, expression2);
var expression3 = LinqExpression.Or(expression2, expression3);
var expression4 = LinqExpression.IndexOr(expression2, expression3);
Last updated on by Monk
+
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

5. LinqExpression 静态类

5.1 创建一个表达式#

var expression = LinqExpression.Create<T>(u => u.Id == 1);
var expression2 = LinqExpression.Create<T>((u,i) => u.Id == 1 && i > 0);

5.2 拼接两个表达式#

// 创建一个初始化的表达式
var expression = LinqExpression.And();
var expression2 = LinqExpression.IndexAnd();
var expression3 = LinqExpression.Or();
var expression4 = LinqExpression.IndexOr();
+
// 拼接表达式
var expression5 = expression.Add(expression2);
var expression6 = expression.AddIf(age > 18, expression2);
var expression7 = expression.Or(expression2);
var expression8 = expression.OrIf(age > 18, expression2);
+
// 获取表达式属性名
var properyName = expression.GetExpressionPropertyName(u => u.Name); // Name
Last updated on by Monk
- + @@ -30,6 +32,6 @@ - + \ No newline at end of file diff --git a/handbook/build/docs/global/messagecenter/index.html b/handbook/build/docs/global/messagecenter/index.html index 312003e989e..248a4e8a4ad 100644 --- a/handbook/build/docs/global/messagecenter/index.html +++ b/handbook/build/docs/global/messagecenter/index.html @@ -8,7 +8,7 @@ 9. MessageCenter 静态类 | Furion - + @@ -23,7 +23,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

9. MessageCenter 静态类

9.1 订阅消息#

MessageCenter.Subscribe<T>("messageId", (i,p) => {
});

9.2 发送消息#

MessageCenter.Send("messageId", new {});

9.3 取消订阅#

MessageCenter.Unsubscribe("messageId");
Last updated on by Monk
- + diff --git a/handbook/build/docs/global/oops/index.html b/handbook/build/docs/global/oops/index.html index ef5b271a2c0..3f78da09def 100644 --- a/handbook/build/docs/global/oops/index.html +++ b/handbook/build/docs/global/oops/index.html @@ -8,7 +8,7 @@ 4. Oops 静态类 | Furion - + @@ -22,7 +22,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

4. Oops 静态类

4.1 抛出字符串异常#

throw Oops.Oh("异常消息");
throw Oops.Oh("异常消息:{0}", "出错了");

4.2 指定类型的异常#

throw Oops.Oh("异常消息", typeof(ArgumentNullException));
throw Oops.Oh("异常消息:{0}", typeof(ArgumentNullException), "出错了");

4.3 状态码异常#

throw Oops.Oh(1000);
throw Oops.Oh(1000, "出错了");

4.4 状态码异常#

throw Oops.Oh(1000, typeof(ArgumentNullException));
throw Oops.Oh(1000, typeof(ArgumentNullException), "出错了");
Last updated on by Monk
- + diff --git a/handbook/build/docs/global/shttp/index.html b/handbook/build/docs/global/shttp/index.html index 8295d367c63..963559ba5c4 100644 --- a/handbook/build/docs/global/shttp/index.html +++ b/handbook/build/docs/global/shttp/index.html @@ -8,7 +8,7 @@ 6. Http 静态类 | Furion - + @@ -22,7 +22,7 @@ - + diff --git a/handbook/build/docs/grpc/index.html b/handbook/build/docs/grpc/index.html index e8d66da1762..8c00da70e81 100644 --- a/handbook/build/docs/grpc/index.html +++ b/handbook/build/docs/grpc/index.html @@ -8,7 +8,7 @@ 27. Grpc 服务 | Furion - + @@ -22,7 +22,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️
Last updated on by Monk
- + diff --git a/handbook/build/docs/http/index.html b/handbook/build/docs/http/index.html index 29c472d5f72..5a2d64d8cbe 100644 --- a/handbook/build/docs/http/index.html +++ b/handbook/build/docs/http/index.html @@ -8,7 +8,7 @@ 19. 远程请求 | Furion - + @@ -88,7 +88,7 @@
// 配置 Facebook 基本信息
options.AddHttpClient("facebook", c =>
{
c.BaseAddress = new Uri("https://api.facebook.com/");
c.DefaultRequestHeaders.Add("Accept", "application/vnd.facebook.v3+json");
c.DefaultRequestHeaders.Add("User-Agent", "HttpClientFactory-Sample");
});
})

配置了命名客户端后,每次请求都会自动加上这些配置。

  • 代理请求 使用
[Get("api/getdata"), Client("github")]
Task<User> GetData();
[Put("api/getdata"), Client("facebook")]
Task<User> GetData();
  • 字符串拓展 使用
// 设置请求拦截
var response = await "http://47.100.247.61/api/sysdata/categories".SetClient("github").PostAsync();

19.7 关于同步请求#

Furion 框架内部默认不提供同步请求操作,建议总是使用异步的方式请求。如在不能使用异步的情况下,可自行转换为同步执行。

19.8 反馈与建议#

与我们交流

给 Furion 提 Issue


了解更多

想了解更多 HttpClient 知识可查阅 ASP.NET Core - HTTP 请求 章节

Last updated on by 树袋熊的树(Mars)
- + diff --git a/handbook/build/docs/index.html b/handbook/build/docs/index.html index 7f60ed2fe5b..138b931cc63 100644 --- a/handbook/build/docs/index.html +++ b/handbook/build/docs/index.html @@ -8,7 +8,7 @@ 1.1 介绍 | Furion - + @@ -22,7 +22,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

1.1 介绍

star fork GitHub stars GitHub forks GitHub license nuget

让 .NET 开发更简单,更通用,更流行。

💐 序言#

无私奉献不是天方夜谭,有时候,我们也可以做到。

🍕 名字的由来#

故事是这样子的:

自微软宣布 .NET 5 平台消息之后,就琢磨着开发一个基于 .NET 5 平台的开发框架,想做第一个吃 .NET 5 螃蟹尝鲜之人。

一开始想到了 Lazier 作为框架的名称,中文有 更懒 的意思。符合我的 “一切从简,只为了更懒” 的开发理念。

但是 更懒更烂 中文读音相近且没有特色,而且寓意也不是很好,对此换名问题苦恼了好些天。

刚好有一次在 QQ 群中无意间刷到了群友发的 “先知” 单词:Furion,就那一刻,就认定它了!

Furion 中文有 先知 的意思,恰好符合我创造框架的初衷。所以,Furion 就诞生了。

🍔 关于 LOGO#

Furion 标志设计理念是借鉴著名的 袋鼠理论 设计的。

袋鼠具有长腿、育袋、自我奔跑特点。

  • 长腿:代表着 Furion 拥有稳健的双腿,走在科技的前沿,走的更远,跑的更快。
  • 育袋:小育袋、大作为。期待 Furion 能够育孕出更多 .NET 优秀开发者和生机勃勃的生态。
  • 自我奔跑Furion 自身也要不断学习、不断进步、不断创新、不断开拓。

🍯 开源案例#

  • Admin.NET:基于 Furion 的通用权限管理平台。
  • 考试君:基于 Furion 的在线考试系统
  • 园丁:基于 Furion + Blazor 的超简单后台管理系统
  • Queer:基于 Furion + Layui 的通用型管理系统
  • Pear Admin:基于 Furion + PearAdmin 管理系统
  • JoyAdmin:基于 Furion + iviewadmin 开发的管理系统
  • YShop:基于 Furion + Vue 开发的移动电商项目

🍟 文档地址#

目前文档正在逐步完善中。

🥦 系列教程#

🌭 开源地址#

🍿 Docker 镜像#

  • Docker Hub 线上镜像
docker run --name furion -p 5000:80 monksoul/furion:v1.4.3
  • 手动 打包镜像

打开 CMD/Shell/PowerShell 进入 Furion 项目根目录打包 Furion 镜像:

docker build -t furion:v1.4.3 .

打包成功后,直接 docker run

docker run --name furion -p 5000:80 furion:v1.4.3

🥥 框架拓展包#

包类型名称版本描述
nugetFurionnugetFurion 核心包
nugetFurion.Extras.Authentication.JwtBearernugetFurion Jwt 拓展包
nugetFurion.Extras.DependencyModel.CodeAnalysisnugetFurion CodeAnalysis 拓展包
nugetFurion.Extras.Web.HttpContextnugetFurion HttpContext 拓展包
nugetFurion.Extras.ObjectMapper.MapsternugetFurion Mapster 拓展包
nugetFurion.Extras.DatabaseAccessor.SqlSugarnugetFurion SqlSugar 拓展包
nugetFurion.Extras.DatabaseAccessor.DappernugetFurion Dapper 拓展包
nugetFurion.Extras.Logging.SerilognugetFurion Serilog 拓展包

🍄 框架脚手架#

模板类型名称版本描述
nugetFurion.Template.MvcnugetMvc 模板
nugetFurion.Template.ApinugetWebApi 模板
nugetFurion.Template.AppnugetMvc/WebApi 模板
nugetFurion.Template.RazornugetRazorPages 模板
nugetFurion.Template.RazorWithWebApinugetRazorPages/WebApi 模板
nugetFurion.Template.BlazornugetBlazor 模板
nugetFurion.Template.BlazorWithWebApinugetBlazor/WebApi 模板

如何使用脚手架

🍎 框架特点#

  • 全新面貌:基于 .NET 5 平台,没有历史包袱
  • 极易入门:只需要一个 Inject() 即可完成配置
  • 极速开发:内置丰富的企业应用开发功能
  • 极少依赖:框架只依赖两个第三方包
  • 极其灵活:轻松面对多变复杂的需求
  • 极易维护:采用独特的架构思想,只为长久维护设计
  • 完整文档:提供完善的开发文档

🥞 架构设计#

正在整理中...

🥝 功能模块#

🥐 框架依赖#

Furion 为了追求极速入门,极致性能,尽可能的不使用或减少第三方依赖。目前 Furion 仅集成了以下两个依赖:

麻雀虽小五脏俱全。Furion 即使只集成了这两个依赖,但是主流的 依赖注入/控制反转AOP 面向切面编程,事件总线数据验证数据库操作 等等一个都不少。

🥗 环境要求#

  • Visual Studio 2019 16.8 +
  • .NET 5 SDK +
  • .Net Standard 2.1 +

🥪 支持平台#

  • 运行环境
    • Windows
    • Linux
    • MacOS
    • Docker/K8S/K3S/Rancher
    • Xamarin/MAUI
  • 数据库
    • SqlServer
    • Sqlite
    • Azure Cosmos
    • MySql
    • MariaDB
    • PostgreSQL
    • InMemoryDatabase
    • Oracle
    • Firebird
    • 达梦数据库
  • 应用部署
    • Kestrel
    • Nginx
    • Jexus
    • IIS
    • Apache
    • PM2
    • Supervisor
    • 单文件
    • 容器(Docker/K8S/K3S/Rancher)

🍖 关于性能#

Furion 目前采用 Visual Studio 2019 16.8 自带性能测试和 JMeter 进行测试,由于篇幅有限,只贴部分测试图,测试结果如下:


🌴 Stars 趋势图#

Stargazers over time

🍚 关于作者#

一个拥有近 13 年开发经验 .NETer。喜欢分享,喜欢新技术,在互联网多个技术领域皆有涉猎,MIP(dotNET China Most Influential Professional) 专家,同时多次获得开源中国 Gitee 授予 GVP 证书。

🍤 项目成员#

🎈 欢迎更多的开发者加入 Furion 大家庭。

🍝 他们都在用#

  • 百签科技(广东)有限公司
  • 码为科技(广州)有限公司
  • 夫上技术(阳江)有限公司
  • 广州启顺国际货运代理有限公司
  • 森丰供应链服务(广州)有限公司
  • 中山赢友网络科技有限公司
  • 中山模思软件科技有限公司
  • 珠海市恒泰新软件有限责任公司
  • 珠海思诺锐创软件有限公司
  • 深圳市易胜科技有限公司
  • 重庆虫儿飞科技有限公司
  • 重庆林木森科技有限公司
  • 深圳市品立方科技有限公司
  • 上海奥达科股份有限公司
  • 中山市泓升软件科技有限公司
  • 唐山天权建筑科技有限公司
  • 北京帝龙科技有限公司
  • 深圳市希立网络有限公司
  • 广州市飞帆计算机技术有限公司
  • 泉州市润海信息科技有限公司
  • 成都市彼岸里信息科技有限公司
  • 福建省山水生活服务集团有限公司
  • 安徽宝典网络科技有限公司
  • 西安空岛网络科技有限公司
  • 果糖大数据科技(南通)有限公司
  • 上海楷青信息技术有限公司
  • 上海邮银通信发展有限公司
  • 合纵动力软件科技有限公司
  • 深圳合纵动力软件科技有限公司
  • 北京帝龙科技有限公司

如果您的项目使用到 Furion 开发,可以告诉我们。

🍻 贡献代码#

Furion 遵循 Apache-2.0 开源协议,欢迎大家提交 PRIssue

如果要为项目做出贡献,请查看贡献指南

🍍 捐赠列表#

注:排序按捐赠顺序书写

捐赠人昵称捐赠金额(元)附语
🤴 爱吃油麦菜100感谢您的开源项目!
👳‍♂️ 麦壳饼200感谢您的开源项目!
👨 Sun100感谢您的开源项目!
👶 d61761720感谢您的开源项目!
👦 Diqiguoji00816.66见贤思齐
👲 nodyang100感谢您的开源项目!
👳‍♀️ mictxd100吹过的牛都实现。
🧓 欧流全10希望将来超越 Spring
👨‍⚕️ lionkon10...看了框架感觉拿来学习是很不错的...
😤 好人!10Nice 的小僧,我们的 dotnetchina 马上火起来了
😮 木木 Woody10感谢您的开源项目!
😚 Joker HouQQ 超级会员一个月
🤠 ccdfzQQ 专属红包 199
🌝 天夫李总支付宝 6666Furion 非常有意思,持续关注
😝 六尘子微信红包 199公司已经使用,小小敬意
🤠 ccdfzQQ 专属红包 200赞助一根内存条
🤑 邓亮灯28.88感谢您的开源项目!
😬 天道酬勤微信二维码 188小小心意
🥰 却月居士QQ 专属红包 100恭喜发财
🤩 鲁旭100感谢您的开源项目!
😬 散客行微信二维码 666终于找到一个不错的框架
😌 本心100项目功能很强大
🙆‍♂️ 毕业生100请你喝杯咖啡
🦹‍♀️ 猪鼻子微信二维码 668
🧟‍♂️ 明年·今日200使用的框架里最爽的,最理想的!加油
👨‍🎓 过去的过去50感谢您的开源项目!
👨‍🔧 万里兮100新公司的第一个项目从 Furion 开始
👴 Muphalem20很热心很亲切的开发者,加油!
💂‍♂️ 吃锅巴的码农微信二维码 500就冲你的文档写得好!
🤴 三重罗生门微信红包 200下次烤鱼你请!
🤵 李涛10加油,我们看到了 dotnet 美好的明天 :)
😂 !@#$%^&QQ 专属红包 100刚接触 furion,文档真棒
😵 李斌20看到一个不错的框架,学习学习,感谢作者的无私奉献
😞 逞强QQ 专属红包 20恭喜发财
🤒 顾锦松QQ 专属红包 200期待文档完成时候
🧟‍♀️ 哈哈微信赞赏码 1000点赞作者!
🍍 Z微信赞赏码 100恭喜孩子诞生,谢谢大佬
🍲 海涛50恭喜
😣 h微信赞赏码 100qq82683656
👱‍♀️ 冷大大微信赞赏码 100加快文档和教学补充哦,另外需要钉钉群,平常不用 QQ
👜 腾坤微信赞赏码 10感谢您的开源项目,QQ:565728589
🚆 文耶耶微信赞赏码 10很棒
🎟 Cynthiax微信转账 5000一路看着过来,小小心意
🥴 一花一世界微信赞赏码 10感谢开源,感谢持续更新
🥪 。微信赞赏码 2感谢
🎄微信赞赏码 20感谢你的开源项目
🍖 班卓微信赞赏码 9.9新年快乐
🥖 雨天裸奔的猫微信赞赏码 10加油!好东西,期待更多新特性
🍖 班卓微信赞赏码 9.9加个鸡腿
🍘 Egota Tiya微信赞赏码 6.66真的不错,准备使用这个框架
🤩 李氏天下微信赞赏码 200坚持下去
🎗 Trube微信赞赏码 200感恩
🧦 不长胡子的毛微信赞赏码 100Fur
👓 醉酒码农微信赞赏码 1000单次只能赞助 200,捐赠 5 次,支持 Furion
😢 XIUXIN微信赞赏码 20谢大佬,春天里的第一杯奶茶
👩‍🦳 吴鹏微信赞赏码 100感谢这么好的框架和文档
🧔 SymmmeeQQ 专属红包 20太牛了
🤴 隐居~~~QQ 专属红包 100支持一下吧
👵 饭粥微信赞赏码 666666666666
🎭 Free微信赞赏码 20感谢开源。比较敬业的架构师,支持一下
👑 时不待我微信赞赏码 50请你喝咖啡
😋 Eway5微信赞赏码 99找 abp 搜到 Furion 的,没想到国内有这么优秀的贡献者

非常感谢您们的支持,正是因为您们,中国开源才可以越走越远,Furion 越走越远。

如果想成为 Furion 支持者或赞助商,请考虑:

🥔 QQ 交流群#

dotNET 中国 ① 🥇(已满

dotNET 中国 ② 🥈(已满

dotNET 中国 ③(空余)

🧆 友情链接#

👉 Furion 👉 SqlSugar 👉 Layx 👉 t-io 👉 ThinkPHP 👉 Hutool 👉 BootstrapAdmin 👉 BootstrapBlazor 👉 IoTSharp 👉 Anno.Core 👉 WaterCloud 👉 OpenAuth.Net

🍵 特别鸣谢#

在这里特别感谢 QQ 网名:蓝狐星Furion 提供演示云服务器。

Last updated on by 百小僧
- + diff --git a/handbook/build/docs/job/index.html b/handbook/build/docs/job/index.html index 0cd7d02c67a..b2c1c51af50 100644 --- a/handbook/build/docs/job/index.html +++ b/handbook/build/docs/job/index.html @@ -8,7 +8,7 @@ 26. 任务调度 | Furion - + @@ -22,7 +22,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️
Last updated on by Monk
- + diff --git a/handbook/build/docs/json-serialization/index.html b/handbook/build/docs/json-serialization/index.html index 6a7ba691706..64dfb5d9cd0 100644 --- a/handbook/build/docs/json-serialization/index.html +++ b/handbook/build/docs/json-serialization/index.html @@ -8,7 +8,7 @@ 23. JSON 序列化 | Furion - + @@ -26,7 +26,7 @@
namespace Furion.Core
{
/// <summary>
/// Newtonsoft.Json 实现
/// </summary>
public class NewtonsoftJsonSerializerProvider : IJsonSerializerProvider, ISingleton
{
/// <summary>
/// 序列化对象
/// </summary>
/// <param name="value"></param>
/// <param name="jsonSerializerOptions"></param>
/// <returns></returns>
public string Serialize(object value, object jsonSerializerOptions = null)
{
return JsonConvert.SerializeObject(value, jsonSerializerOptions as JsonSerializerSettings);
}
/// <summary>
/// 反序列化字符串
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="json"></param>
/// <param name="jsonSerializerOptions"></param>
/// <returns></returns>
public T Deserialize<T>(string json, object jsonSerializerOptions = null)
{
return JsonConvert.DeserializeObject<T>(json, jsonSerializerOptions as JsonSerializerSettings);
}
}
}

23.5.2 序列化属性名大写#

  • System.Text.Json 方式
services.AddControllersWithViews()
.AddJsonOptions(options => {
options.JsonSerializerOptions.PropertyNamingPolicy = null;
});
  • Newtonsoft.Json 方式
services.AddControllersWithViews()
.AddNewtonsoftJson(options =>
{
options.SerializerSettings.ContractResolver = new DefaultContractResolver();
});
特别注意

采用 Newtonsoft.Json 方式接口返回值能够正常输出,但是 Swagger 界面中的 Example Values 依然显示小写字母开头的属性,这时只需要再添加 System.Text.Json 配置即可,如:

.AddJsonOptions(options => {
options.JsonSerializerOptions.PropertyNamingPolicy = null;
});

主要原因是 Swagger 拓展包底层依赖了 System.Text.Json

23.5.3 时间格式化#

  • System.Text.Json 方式
services.AddControllersWithViews()
.AddJsonOptions(options =>
{
options.JsonSerializerOptions.Converters.AddDateFormatString("yyyy-MM-dd HH:mm:ss");
});

需引用 System.Text.Json 命名空间。

  • Newtonsoft.Json 方式
services.AddControllersWithViews()
.AddNewtonsoftJson(options =>
{
options.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss";
});

23.5.4 忽略循环引用#

  • System.Text.Json 方式
services.AddControllersWithViews()
.AddJsonOptions(options =>
{
options.JsonSerializerOptions.ReferenceHandler = ReferenceHandler.IgnoreCycles;
});
特别说明

.NET 5 中,System.Text.Json 并不支持处理循环引用问题,以上的解决方案只限用于 .NET 6 Preview 2+。😂

需引用 System.Text.Json 命名空间。

  • Newtonsoft.Json 方式
services.AddControllersWithViews()
.AddNewtonsoftJson(options =>
{
options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
});

23.6 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by Monk
- + diff --git a/handbook/build/docs/local-language/index.html b/handbook/build/docs/local-language/index.html index bd2c08473ac..0b3bf40db58 100644 --- a/handbook/build/docs/local-language/index.html +++ b/handbook/build/docs/local-language/index.html @@ -8,7 +8,7 @@ 21. 全球化和本地化 | Furion - + @@ -31,7 +31,7 @@
public TestController(IStringLocalizerFactory factory)
{
_localizer = factory.Create(L.LangType);
}
public IActionResult About()
{
ViewData["Message"] = _localizer["Your application description page."];
}
}

21.9 LocalizationSettings 配置#

  • LocalizationSettings 多语言配置根节点
    • ResourcesPath:资源目录,string 类型,默认 Resources
    • SupportedCultures:支持的语言区域码类别,string[] 类型
    • DefaultCulture:默认语言区域码,如果为空,则取 SupportedCultures 第一项

21.10 区域码列表#

  • af 公用荷兰语
  • af-ZA 公用荷兰语 - 南非
  • sq 阿尔巴尼亚
  • sq-AL 阿尔巴尼亚 -阿尔巴尼亚
  • ar 阿拉伯语
  • ar-DZ 阿拉伯语 -阿尔及利亚
  • ar-BH 阿拉伯语 -巴林
  • ar-EG 阿拉伯语 -埃及
  • ar-IQ 阿拉伯语 -伊拉克
  • ar-JO 阿拉伯语 -约旦
  • ar-KW 阿拉伯语 -科威特
  • ar-LB 阿拉伯语 -黎巴嫩
  • ar-LY 阿拉伯语 -利比亚
  • ar-MA 阿拉伯语 -摩洛哥
  • ar-OM 阿拉伯语 -阿曼
  • ar-QA 阿拉伯语 -卡塔尔
  • ar-SA 阿拉伯语 - 沙特阿拉伯
  • ar-SY 阿拉伯语 -叙利亚共和国
  • ar-TN 阿拉伯语 -北非的共和国
  • ar-AE 阿拉伯语 - 阿拉伯联合酋长国
  • ar-YE 阿拉伯语 -也门
  • hy 亚美尼亚
  • hy-AM 亚美尼亚的 -亚美尼亚
  • az Azeri
  • az-AZ-Cyrl Azeri-(西里尔字母的) 阿塞拜疆
  • az-AZ-Latn Azeri(拉丁文)- 阿塞拜疆
  • eu 巴斯克
  • eu-ES 巴斯克 -巴斯克
  • be Belarusian
  • be-BY Belarusian-白俄罗斯
  • bg 保加利亚
  • bg-BG 保加利亚 -保加利亚
  • ca 嘉泰罗尼亚
  • ca-ES 嘉泰罗尼亚 -嘉泰罗尼亚
  • zh-HK 华 - 香港的 SAR
  • zh-MO 华 - 澳门的 SAR
  • zh-CN 华 -中国
  • zh-CHS 华 (单一化)
  • zh-SG 华 -新加坡
  • zh-TW 华 -台湾
  • zh-CHT 华 (传统的)
  • hr 克罗埃西亚
  • hr-HR 克罗埃西亚 -克罗埃西亚
  • cs 捷克
  • cs-CZ 捷克 - 捷克
  • da 丹麦文
  • da-DK 丹麦文 -丹麦
  • div Dhivehi
  • div-MV Dhivehi-马尔代夫
  • nl 荷兰
  • nl-BE 荷兰 -比利时
  • nl-NL 荷兰 - 荷兰
  • en 英国
  • en-AU 英国 -澳洲
  • en-BZ 英国 -伯利兹
  • en-CA 英国 -加拿大
  • en-CB 英国 -加勒比海
  • en-IE 英国 -爱尔兰
  • en-JM 英国 -牙买加
  • en-NZ 英国 - 新西兰
  • en-PH 英国 -菲律宾共和国
  • en-ZA 英国 - 南非
  • en-TT 英国 - 千里达托贝哥共和国
  • en-GB 英国 - 英国
  • en-US 英国 - 美国
  • en-ZW 英国 -津巴布韦
  • et 爱沙尼亚
  • et-EE 爱沙尼亚的 -爱沙尼亚
  • fo Faroese
  • fo-FO Faroese- 法罗群岛
  • fa 波斯语
  • fa-IR 波斯语 -伊朗王国
  • fi 芬兰语
  • fi-FI 芬兰语 -芬兰
  • fr 法国
  • fr-BE 法国 -比利时
  • fr-CA 法国 -加拿大
  • fr-FR 法国 -法国
  • fr-LU 法国 -卢森堡
  • fr-MC 法国 -摩纳哥
  • fr-CH 法国 -瑞士
  • gl 加利西亚
  • gl-ES 加利西亚 -加利西亚
  • ka 格鲁吉亚州
  • ka-GE 格鲁吉亚州 -格鲁吉亚州
  • de 德国
  • de-AT 德国 -奥地利
  • de-DE 德国 -德国
  • de-LI 德国 -列支敦士登
  • de-LU 德国 -卢森堡
  • de-CH 德国 -瑞士
  • el 希腊
  • el-GR 希腊 -希腊
  • gu Gujarati
  • gu-IN Gujarati-印度
  • he 希伯来
  • he-IL 希伯来 -以色列
  • hi 北印度语
  • hi-IN 北印度的 -印度
  • hu 匈牙利
  • hu-HU 匈牙利的 -匈牙利
  • is 冰岛语
  • is-IS 冰岛的 -冰岛
  • id 印尼
  • id-ID 印尼 -印尼
  • it 意大利
  • it-IT 意大利 -意大利
  • it-CH 意大利 -瑞士
  • ja 日本
  • ja-JP 日本 -日本
  • kn 卡纳达语
  • kn-IN 卡纳达语 -印度
  • kk Kazakh
  • kk-KZ Kazakh-哈萨克
  • kok Konkani
  • kok-IN Konkani-印度
  • ko 韩国
  • ko-KR 韩国 -韩国
  • ky Kyrgyz
  • ky-KZ Kyrgyz-哈萨克
  • lv 拉脱维亚
  • lv-LV 拉脱维亚的 -拉脱维亚
  • lt 立陶宛
  • lt-LT 立陶宛 -立陶宛
  • mk 马其顿
  • mk-MK 马其顿 -FYROM
  • ms 马来
  • ms-BN 马来 -汶莱
  • ms-MY 马来 -马来西亚
  • mr 马拉地语
  • mr-IN 马拉地语 -印度
  • mn 蒙古
  • mn-MN 蒙古 -蒙古
  • no 挪威
  • nb-NO 挪威 (Bokm?l) - 挪威
  • nn-NO 挪威 (Nynorsk)- 挪威
  • pl 波兰
  • pl-PL 波兰 -波兰
  • pt 葡萄牙
  • pt-BR 葡萄牙 -巴西
  • pt-PT 葡萄牙 -葡萄牙
  • pa Punjab 语
  • pa-IN Punjab 语 -印度
  • ro 罗马尼亚语
  • ro-RO 罗马尼亚语 -罗马尼亚
  • ru 俄国
  • ru-RU 俄国 -俄国
  • sa 梵文
  • sa-IN 梵文 -印度
  • sr-SP-Cyrl 塞尔维亚 -(西里尔字母的) 塞尔维亚共和国
  • sr-SP-Latn 塞尔维亚 (拉丁文)- 塞尔维亚共和国
  • sk 斯洛伐克
  • sk-SK 斯洛伐克 -斯洛伐克
  • sl 斯洛文尼亚
  • sl-SI 斯洛文尼亚 -斯洛文尼亚
  • es 西班牙
  • es-AR 西班牙 -阿根廷
  • es-BO 西班牙 -玻利维亚
  • es-CL 西班牙 -智利
  • es-CO 西班牙 -哥伦比亚
  • es-CR 西班牙 - 哥斯达黎加
  • es-DO 西班牙 - 多米尼加共和国
  • es-EC 西班牙 -厄瓜多尔
  • es-SV 西班牙 - 萨尔瓦多
  • es-GT 西班牙 -危地马拉
  • es-HN 西班牙 -洪都拉斯
  • es-MX 西班牙 -墨西哥
  • es-NI 西班牙 -尼加拉瓜
  • es-PA 西班牙 -巴拿马
  • es-PY 西班牙 -巴拉圭
  • es-PE 西班牙 -秘鲁
  • es-PR 西班牙 - 波多黎各
  • es-ES 西班牙 -西班牙
  • es-UY 西班牙 -乌拉圭
  • es-VE 西班牙 -委内瑞拉
  • sw Swahili
  • sw-KE Swahili-肯尼亚
  • sv 瑞典
  • sv-FI 瑞典 -芬兰
  • sv-SE 瑞典 -瑞典
  • syr Syriac
  • syr-SY Syriac-叙利亚共和国
  • ta 坦米尔
  • ta-IN 坦米尔 -印度
  • tt Tatar
  • tt-RU Tatar-俄国
  • te Telugu
  • te-IN Telugu-印度
  • th 泰国
  • th-TH 泰国 -泰国
  • tr 土耳其语
  • tr-TR 土耳其语 -土耳其
  • uk 乌克兰
  • uk-UA 乌克兰 -乌克兰
  • ur Urdu
  • ur-PK Urdu-巴基斯坦
  • uz Uzbek
  • uz-UZ-Cyrl Uzbek-(西里尔字母的) 乌兹别克斯坦
  • uz-UZ-Latn Uzbek(拉丁文)- 乌兹别克斯坦
  • vi 越南
  • vi-VN 越南 -越南

21.11 反馈与建议#

与我们交流

给 Furion 提 Issue


了解更多

想了解更多 多语言 知识可查阅 ASP.NET Core - 全局化和本地化 章节。

Last updated on by Monk
- + diff --git a/handbook/build/docs/logging/index.html b/handbook/build/docs/logging/index.html index 40f671f8372..06b40cc41e6 100644 --- a/handbook/build/docs/logging/index.html +++ b/handbook/build/docs/logging/index.html @@ -8,7 +8,7 @@ 18. 日志记录 | Furion - + @@ -30,7 +30,7 @@
namespace Furion.Web.Entry
{
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args)
{
return Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.Inject()
.UseStartup<Startup>();
})
.UseSerilogDefault();
}
}
}
特别注意

.UseSerilogDefault() 默认集成了 控制台文件 方式。如需自定义写入,则传入需要写入的介质即可:

.UseSerilogDefault(config =>
{
config.WriteTo.Console(outputTemplate: "[{Timestamp:HH:mm:ss} {Level:u3}] {Message:lj} {Properties:j}{NewLine}{Exception}")
.WriteTo.File("log.txt", rollingInterval: RollingInterval.Day, rollOnFileSizeLimit: true);
});
  • 替换 appsetting.json 默认日志内容
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information",
"Microsoft.EntityFrameworkCore": "Information"
}
}

替换为:

"Serilog": {
"MinimumLevel": {
"Default": "Information",
"Override": {
"System": "Warning",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information",
"Microsoft.EntityFrameworkCore": "Information"
}
}
}

18.5.2 记录请求日志#

Serilog 日志组件也提供了非常方便快捷的请求日志中间件,只需要在 Startup.cs 中启用即可。如:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseStaticFiles();
app.UseSerilogRequestLogging(); // 必须在 UseStaticFiles 和 UseRouting 之间
app.UseRouting();
}

18.6 日志示例#

下面便是日志输出日志的模板,支持各种自定义方式

2020-12-21 15:54:43.775 +08:00 [INF] Application started. Press Ctrl+C to shut down.
2020-12-21 15:54:43.897 +08:00 [INF] Hosting environment: Development
2020-12-21 15:54:43.899 +08:00 [INF] Content root path: D:\MONK\Furion\samples\Furion.Web.Entry
2020-12-21 15:55:00.651 +08:00 [WRN] Sensitive data logging is enabled. Log entries and exception messages may include sensitive application data; this mode should only be enabled during development.
2020-12-21 15:55:00.817 +08:00 [INF] Entity Framework Core 5.0.1 initialized 'DefaultDbContext' using provider 'Microsoft.EntityFrameworkCore.Sqlite' with options: SensitiveDataLoggingEnabled DetailedErrorsEnabled MaxPoolSize=100 MigrationsAssembly=Furion.Database.Migrations
2020-12-21 15:55:01.711 +08:00 [WRN] Compiling a query which loads related collections for more than one collection navigation either via 'Include' or through projection but no 'QuerySplittingBehavior' has been configured. By default Entity Framework will use 'QuerySplittingBehavior.SingleQuery' which can potentially result in slow query performance. See https://go.microsoft.com/fwlink/?linkid=2134277 for more information. To identify the query that's triggering this warning call 'ConfigureWarnings(w => w.Throw(RelationalEventId.MultipleCollectionIncludeWarning))'
2020-12-21 15:55:01.919 +08:00 [INF] Executed DbCommand (31ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30']
SELECT "p"."Id", "p"."Name", "p"."Age", "p"."Address", "p0"."PhoneNumber", "p0"."QQ", "p"."CreatedTime", "p0"."Id", "c"."Id", "c"."Name", "c"."Gender", "t"."Id", "t"."Name", "t"."PersonsId", "t"."PostsId"
FROM "Person" AS "p"
LEFT JOIN "PersonDetail" AS "p0" ON "p"."Id" = "p0"."PersonId"
LEFT JOIN "Children" AS "c" ON "p"."Id" = "c"."PersonId"
LEFT JOIN (
SELECT "p2"."Id", "p2"."Name", "p1"."PersonsId", "p1"."PostsId"
FROM "PersonPost" AS "p1"
INNER JOIN "Post" AS "p2" ON "p1"."PostsId" = "p2"."Id"
) AS "t" ON "p"."Id" = "t"."PersonsId"
ORDER BY "p"."Id", "p0"."Id", "c"."Id", "t"."PersonsId", "t"."PostsId", "t"."Id"
2020-12-21 15:55:25.354 +08:00 [INF] Executed DbCommand (3ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30']
SELECT "p"."Id", "p"."Name", "p"."Age", "p"."Address", "p0"."PhoneNumber", "p0"."QQ", "p"."CreatedTime", "p0"."Id", "c"."Id", "c"."Name", "c"."Gender", "t"."Id", "t"."Name", "t"."PersonsId", "t"."PostsId"
FROM "Person" AS "p"
LEFT JOIN "PersonDetail" AS "p0" ON "p"."Id" = "p0"."PersonId"
LEFT JOIN "Children" AS "c" ON "p"."Id" = "c"."PersonId"
LEFT JOIN (
SELECT "p2"."Id", "p2"."Name", "p1"."PersonsId", "p1"."PostsId"
FROM "PersonPost" AS "p1"
INNER JOIN "Post" AS "p2" ON "p1"."PostsId" = "p2"."Id"
) AS "t" ON "p"."Id" = "t"."PersonsId"
ORDER BY "p"."Id", "p0"."Id", "c"."Id", "t"."PersonsId", "t"."PostsId", "t"."Id"
2020-12-21 15:58:27.328 +08:00 [INF] Application started. Press Ctrl+C to shut down.
2020-12-21 15:58:27.442 +08:00 [INF] Hosting environment: Development
2020-12-21 15:58:27.444 +08:00 [INF] Content root path: D:\MONK\Furion\samples\Furion.Web.Entry
2020-12-21 15:58:27.909 +08:00 [INF] HTTP GET / responded 200 in 457.0657 ms
2020-12-21 15:58:33.336 +08:00 [INF] HTTP GET /api/index.html responded 200 in 95.9277 ms
2020-12-21 15:58:34.187 +08:00 [INF] HTTP GET /swagger/Default/swagger.json responded 200 in 674.9800 ms

18.7 打印日志到 Swagger#

Furion 框架中默认集成了 MiniProfiler 组件并与 Swagger 进行了结合,如需打印日志或调试代码,只需调用以下方法即可:

App.PrintToMiniProfiler("分类", "状态", "要打印的消息");

18.9 反馈与建议#

与我们交流

给 Furion 提 Issue


了解更多

想了解更多 日志 知识可查阅 ASP.NET Core - 日志 章节 和 Serilog 文档。

Last updated on by Monk
- + diff --git a/handbook/build/docs/object-mapper/index.html b/handbook/build/docs/object-mapper/index.html index 9cd38ed4d87..5a7421178aa 100644 --- a/handbook/build/docs/object-mapper/index.html +++ b/handbook/build/docs/object-mapper/index.html @@ -8,7 +8,7 @@ 13. 对象数据映射 | Furion - + @@ -24,7 +24,7 @@
var dto = new Dto();
dto.Id = entity.Id;
dto.Name = entity.Name;
dto.Age = entity.Age;
dto.Address = entity.Address;
dto.FullName = entity.FirstName + entity.LastName;
dto.IdCard = entity.IdCard.Replace("1234", "****");

上面的例子似乎没有任何问题,但是如果很多地方需要这样的赋值操作、或者相同的赋值操作在多个地方使用,又或者一个类中含有非常多的属性或自定义赋值操作。那么这样的操作效率极低,容易出错,且代码非常臃肿和冗余。

所以,实现自动映射赋值和支持特殊配置的需求就有了。目前 C# 平台有两个优秀的对象映射工具:MapsterAutoMapperFurion 框架中,推荐使用 MapsterMapster 是一款极易使用且超高性能的对象映射框架。

13.3 Mapster 使用#

现在,我们可以通过 Mapster 提供的对象映射方法:Adapt 方法改造上面的例子:

安装拓展包

Furion.Core 层安装 Furion.Extras.ObjectMapper.Mapster 拓展包,无需手动调用,Furion 会自动加载并调用。

13.3.1 快速入门#

var entity = repository.Find(1);
var dto = entity.Adapt<Dto>();

仅仅一行代码就可以实现 entity -> dto 的转换,如果涉及到赋值的复制操作,如 dto.FullNamedto.IdCard,我们只需要自定义映射规则类即可。

13.3.2 自定义映射规则#

using Mapster;
using System;
namespace Furion.Application
{
public class Mapper : IRegister
{
public void Register(TypeAdapterConfig config)
{
config.ForType<Entity, Dto>()
.Map(dest => dest.FullName, src => src.FirstName + src.LastName)
.Map(dest => dest.IdCard, src => src.IdCard.Replace("1234", "****"));
}
}
}
小知识

该映射文件 Mapper.cs 可以放在任何项目或文件夹中,Furion 会在程序启动的时候自动扫描并注入配置。

13.3.3 依赖注入方式#

Mapster 除了提供 Adapt 拓展方法以外,同时还提供依赖注入的方式。

public Person(IMapper mapper)
{
var dto = _mapper.Map<Dto>(entity);
}

13.3.4 和 EFCore 配合#

Mapster 还提供了 ProjectToType Linq 拓展方法减少我们手动 Select 操作,如:

正常的操作:

var destinations = context.Sources
.Select(c => new Destination {
Id = p.Id,
Name = p.Name,
Surname = p.Surname,
....
})
.ToList();

使用 Mapster 之后:

var destinations = context.Sources.ProjectToType<Destination>().ToList();

13.5 全局默认配置#

Furion 提供全局默认映射配置选项 TypeAdapterConfig.GlobalSettings.Default,可在 Startup 中配置即可,如:

TypeAdapterConfig.GlobalSettings.Default
.PreserveReference(true);

13.6 反馈与建议#

与我们交流

给 Furion 提 Issue


了解更多

想了解更多 Mapster 知识可查阅 Mapster - Wiki 文档。

Last updated on by Monk
- + diff --git a/handbook/build/docs/options/index.html b/handbook/build/docs/options/index.html index 603b1aca4ef..15c644b637b 100644 --- a/handbook/build/docs/options/index.html +++ b/handbook/build/docs/options/index.html @@ -8,7 +8,7 @@ 4.2 选项 | Furion - + @@ -52,7 +52,7 @@
public void OnListener(AppInfoOptions options, IConfiguration configuration)
{
var name = options.Name; // 实时的最新值
var version = options.Version; // 实时的最新值
}
public void PostConfigure(AppInfoOptions options, IConfiguration configuration)
{
}
}
特别说明

IConfigurableOptionsListener<TOptions> 继承自 IConfigurableOptions<TOptions>

4.2.10 选项的优缺点#

  • 优点

    • 强类型配置
    • 提供多种读取方式
    • 支持热加载
    • 支持设置默认值/后期配置
    • 支持在运行环境中动态配置
    • 支持验证配置有效性
    • 支持更改通知
    • 支持命名选项
  • 缺点

    • 需要定义对应类型
    • 需要在启动时注册

4.2.11 反馈与建议#

与我们交流

给 Furion 提 Issue


了解更多

想了解更多 选项 知识可查阅 ASP.NET Core - 选项 章节。

Last updated on by 百小僧
- + diff --git a/handbook/build/docs/performance/index.html b/handbook/build/docs/performance/index.html index df6c57549e1..9d0ba013c3d 100644 --- a/handbook/build/docs/performance/index.html +++ b/handbook/build/docs/performance/index.html @@ -8,7 +8,7 @@ 29.2 性能测试 | Furion - + @@ -22,7 +22,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️
Last updated on by Monk
- + diff --git a/handbook/build/docs/process-service/index.html b/handbook/build/docs/process-service/index.html index e5d2eea9c98..347b8397fae 100644 --- a/handbook/build/docs/process-service/index.html +++ b/handbook/build/docs/process-service/index.html @@ -8,7 +8,7 @@ 25. 辅助角色服务 | Furion - + @@ -22,7 +22,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️
Last updated on by Monk
- + diff --git a/handbook/build/docs/reference/index.html b/handbook/build/docs/reference/index.html index 218cf0e8659..62a4322b938 100644 --- a/handbook/build/docs/reference/index.html +++ b/handbook/build/docs/reference/index.html @@ -8,7 +8,7 @@ 2.3 手动搭建分层 | Furion - + @@ -24,7 +24,7 @@
namespace YourName.Web.Entry
{
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args)
{
return Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.Inject()
.UseStartup<Startup>();
});
}
}
}

2.3.3 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by sourcehome
- + diff --git a/handbook/build/docs/saas/index.html b/handbook/build/docs/saas/index.html index 9105fb76f97..b0dee5ff44b 100644 --- a/handbook/build/docs/saas/index.html +++ b/handbook/build/docs/saas/index.html @@ -8,7 +8,7 @@ 11. SaaS 多租户 | Furion - + @@ -60,7 +60,7 @@
public string Host { get; set; }
}
}

如果需要查询该租户信息,可通过以下代码获取,如:

var tenantDbContext = Db.GetDbContext<MultiTenantDbContextLocator>();
var myTenant = tenantDbContext.Set<MyTenant>();

11.9 刷新租户缓存#

Furion 框架会在租户上下文第一次查询时候将租户表缓存起来,避免频发查询数据库,如果更新了租户表,则需要手动刷新租户信息,如:

using Furion.DatabaseAccessor.Extensions;
// 在更新租户信息后调用
_repository.Context.RefreshTenantCache();

11.10 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by Monk
- + diff --git a/handbook/build/docs/settings/appsettings/index.html b/handbook/build/docs/settings/appsettings/index.html index e6402e3892a..f34d23da941 100644 --- a/handbook/build/docs/settings/appsettings/index.html +++ b/handbook/build/docs/settings/appsettings/index.html @@ -8,7 +8,7 @@ 1. 应用配置 | Furion - + @@ -22,7 +22,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

1. 应用配置

1.1 关于配置#

应用配置指的是 Furion 框架全局配置选项。

1.2 配置信息#

  • AppSettings:配置根节点
    • InjectMiniProfiler:是否注入 MiniProfilerbool 类型,默认 true关闭 Swagger 左上角监听
    • InjectSpecificationDocument:是否启用 Swagger 文档,bool 类型,默认 true生产环境可关闭
    • EnabledReferenceAssemblyScan:是否启用通过 dll 方式添加的引用程序集扫描,bool 类型,默认 false
    • ExternalAssemblies:配置外部程序集完整路径,支持动态加载,string[] 类型,默认 []
    • DynamicLogLevel:配置动态日志级别,LogLevel 枚举类型,默认 LogLevel.Information
    • PrintDbConnectionInfo:是否打印数据库连接信息到 MiniProfiler 中,bool 类型,默认 true

1.3 配置示例#

{
"AppSettings": {
"InjectMiniProfiler": false
}
}

1.4 特别注意#

默认情况下,Furion 框架会自动扫描 *.json*.config.xml 文件载入配置中,如需忽略个别文件,需在 appsettings.json 配置文件根节点下配置 IgnoreConfigurationFiles 节点即可,string[] 类型,如:

{
"IgnoreConfigurationFiles": ["runtime.json"]
}

必须在 appsettings.json 文件中配置才有效

Last updated on by 百小僧
- + diff --git a/handbook/build/docs/settings/corsaccessorsettings/index.html b/handbook/build/docs/settings/corsaccessorsettings/index.html index a0b4642773a..0f1b66d0f65 100644 --- a/handbook/build/docs/settings/corsaccessorsettings/index.html +++ b/handbook/build/docs/settings/corsaccessorsettings/index.html @@ -8,7 +8,7 @@ 2. 跨域配置 | Furion - + @@ -22,7 +22,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

2. 跨域配置

2.1 关于配置#

跨域配置指的是 Furion 框架客户端跨域配置选项。

2.2 配置信息#

  • CorsAccessorSettings:配置根节点
    • PolicyName:跨域策略名,sting 类型,必填,默认 FurCorsAccessor
    • WithOrigins:允许跨域的域名列表,string[] 类型,默认 [ "http://localhost:4200" ]
    • WithHeaders:请求表头,没有配置则允许所有表头,string[] 类型
    • WithExposedHeaders:响应标头,string[] 类型
    • WithMethods:设置跨域允许请求谓词,没有配置则允许所有,string[] 类型
    • AllowCredentials:跨域请求中的凭据,bool 类型
    • SetPreflightMaxAge:设置预检过期时间,int 类型

2.3 配置示例#

{
"CorsAccessorSettings": {
"PolicyName": "MyPolicy",
"WithOrigins": ["http://localhost:4200", "https://furion.pro"]
}
}

2.4 使用 axios 前端注意事项#

由于 axios 对跨域有特定的需要,需要响应报文中添加特定 Header 才能放行,如:Access-Control-Expose-Headers: xxxxx,所以,如果前端使用了 axios 请求,需要添加以下配置:

{
"CorsAccessorSettings": {
"WithExposedHeaders": ["X-Pagination","access-token","x-access-token"]
}
}
Last updated on by Monk
- + diff --git a/handbook/build/docs/settings/dependencyinjectionsettings/index.html b/handbook/build/docs/settings/dependencyinjectionsettings/index.html index 6da80fbcf83..1a4219e3254 100644 --- a/handbook/build/docs/settings/dependencyinjectionsettings/index.html +++ b/handbook/build/docs/settings/dependencyinjectionsettings/index.html @@ -8,7 +8,7 @@ 4. 依赖注入配置 | Furion - + @@ -22,7 +22,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

4. 依赖注入配置

4.1 关于配置#

依赖注入配置指的是 Furion 框架依赖注入配置选项。

4.2 配置信息#

  • DependencyInjectionSettings:依赖注入配置根节点
    • Definitions:动态依赖注入配置节点,ExternalService 数组类型
      • ExternalService:配置单个依赖注入信息
        • Interface:配置依赖接口信息,格式:程序集名称;接口完整名称,如:Furion.Application;Furion.Application.ITestService
        • Service:配置接口实现信息,格式同上
        • RegisterType:配置依赖注入的对象生存期,取值:TransientScopedSingleton
        • Action:注册行为,可选值:AddTryAdd,参见 依赖注入-特性配置
        • Pattern:注册选项,参见 依赖注入-特性配置置
        • Named:注册别名,参见 依赖注入-特性配置
        • Order:注册排序,参见 依赖注入-特性配置
        • Proxy:配置代理拦截,格式:程序集名称;代理类完整名称,参见 依赖注入-特性配置

4.3 配置示例#

{
"DependencyInjectionSettings": {
"Definitions": [
{
"Interface": "Furion.Application;Furion.Application.ITestService",
"Service": "Furion.Application;Furion.Application.TestService",
"RegisterType": "Transient",
"Action": "Add",
"Pattern": "SelfWithFirstInterface",
"Named": "TestService",
"Order": 1,
"Proxy": "Furion.Application;Furion.Application.LogDispathProxy"
}
]
}
}
Last updated on by sourcehome
- + diff --git a/handbook/build/docs/settings/dynamicapicontrollersettings/index.html b/handbook/build/docs/settings/dynamicapicontrollersettings/index.html index 517c79501c9..28d4d0f298d 100644 --- a/handbook/build/docs/settings/dynamicapicontrollersettings/index.html +++ b/handbook/build/docs/settings/dynamicapicontrollersettings/index.html @@ -8,7 +8,7 @@ 5. 动态API配置 | Furion - + @@ -22,7 +22,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

5. 动态API配置

5.1 关于配置#

动态 API 配置指的是 Furion 框架动态 API 配置选项。

5.2 配置信息#

  • DynamicApiControllerSettings:配置根节点

    • DefaultRoutePrefix:默认路由前缀,string,默认 api
    • DefaultHttpMethod:默认请求谓词,string,默认:POST
    • DefaultModule:默认模块名称(区域),可用作接口版本,string,默认:v1
    • LowercaseRoute:小写路由格式,bool,默认:true
    • KeepVerb:是否保留动作谓词,bool,默认:false
    • KeepName:是否保留默认名称,bool,默认:fasle
    • CamelCaseSeparator:骆驼(驼峰)命名分隔符,string,默认:-
    • VersionSeparator:版本分隔符,string,默认:@
    • ModelToQueryGET/HEAD 请求将 类类型参数转查询参数bool,默认 false
    • SupportedMvcController:是否支持 Mvc Controller 动态配置,bool,默认 false
    • AbandonControllerAffixes:默认去除控制器名称前后缀列表名,string[],默认:
      • AppServices
      • AppService
      • ApiController
      • Controller
      • Services
      • Service
    • AbandonActionAffixes:默认去除动作方法名称前后缀列表名,string[],默认:
      • Async
    • VerbToHttpMethods:复写默认方法名转 [HttpMethod] 规则,string[][] 二维数组类型,内置匹配规则为:
      ["post"] = "POST",
      ["add"] = "POST",
      ["create"] = "POST",
      ["insert"] = "POST",
      ["submit"] = "POST",
      ["get"] = "GET",
      ["find"] = "GET",
      ["fetch"] = "GET",
      ["query"] = "GET",
      ["getlist"] = "GET",
      ["getall"] = "GET",
      ["put"] = "PUT",
      ["update"] = "PUT",
      ["delete"] = "DELETE",
      ["remove"] = "DELETE",
      ["clear"] = "DELETE",
      ["patch"] = "PATCH"
      • 复写示例
      "DynamicApiControllerSettings": {
      "VerbToHttpMethods": [
      [ "getall", "HEAD" ], // => getall 会被复写为 `[HttpHead]`
      [ "other", "PUT" ] // => 新增一条新规则,比如,一 `[other]` 开头会转换为 `[HttpPut]` 请求
      ]
      }

5.3 配置示例#

{
"DynamicApiControllerSettings": {
"SupportedMvcController": true
}
}
Last updated on by 本心
- + diff --git a/handbook/build/docs/settings/friendlyexceptionsettings/index.html b/handbook/build/docs/settings/friendlyexceptionsettings/index.html index 7141c87cdbc..3bb10bd764c 100644 --- a/handbook/build/docs/settings/friendlyexceptionsettings/index.html +++ b/handbook/build/docs/settings/friendlyexceptionsettings/index.html @@ -8,7 +8,7 @@ 6. 友好异常配置 | Furion - + @@ -22,7 +22,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

6. 友好异常配置

6.1 关于配置#

友好异常配置指的是 Furion 框架友好异常配置选项。

6.2 配置信息#

  • FriendlyExceptionSettings:配置根节点
    • HideErrorCode:隐藏错误码,bool 类型,默认 false
    • DefaultErrorCode:默认错误码,string 类型
    • DefaultErrorMessage:默认错误消息,string 类型

6.3 配置示例#

{
"FriendlyExceptionSettings": {
"DefaultErrorMessage": "系统异常,请联系管理员"
}
}

6.4 异常消息配置#

Furion 框架还为友好异常消息提供外部配置

6.4.1 配置信息#

  • ErrorCodeMessageSettings:配置根节点
    • Definitions:配置异常错误码消息类型,[错误状态码,错误消息][] 类型,如:[5000, "{0} 不能小于 {1}"]

6.4.2 配置示例#

{
"ErrorCodeMessageSettings": {
"Definitions": [
[5000, "{0} 不能小于 {1}"],
[5001, "我叫 {0} 名字", "百小僧"],
[5002, "Oops! 出错了"]
]
}
}
Last updated on by Monk
- + diff --git a/handbook/build/docs/settings/localizationsettings/index.html b/handbook/build/docs/settings/localizationsettings/index.html index 570525b1f3b..c5ecdf31643 100644 --- a/handbook/build/docs/settings/localizationsettings/index.html +++ b/handbook/build/docs/settings/localizationsettings/index.html @@ -8,7 +8,7 @@ 8. 多语言配置 | Furion - + @@ -22,7 +22,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

8. 多语言配置

8.1 关于配置#

多语言配置指的是 Furion 框架全球化和本地化选项。

8.2 配置信息#

  • LocalizationSettings 多语言配置根节点
    • ResourcesPath:资源目录,string 类型,默认 Resources
    • SupportedCultures:支持的语言区域码类别,string[] 类型
    • DefaultCulture:默认语言区域码,如果为空,则取 SupportedCultures 第一项

8.3 配置示例#

{
"LocalizationSettings": {
"SupportedCultures": ["zh-CN", "en-US"], // 配置支持的语言列表
"DefaultCulture": "zh-CN" // 配置默认语言,如果不配置,取 SupportedCultures 的第一项
}
}
Last updated on by Monk
- + diff --git a/handbook/build/docs/settings/specificationdocumentsettings/index.html b/handbook/build/docs/settings/specificationdocumentsettings/index.html index 936045d9135..28ed0d40711 100644 --- a/handbook/build/docs/settings/specificationdocumentsettings/index.html +++ b/handbook/build/docs/settings/specificationdocumentsettings/index.html @@ -8,7 +8,7 @@ 7. 规范化文档配置 | Furion - + @@ -22,7 +22,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

7. 规范化文档配置

7.1 关于配置#

规范化文档配置指的是 Furion 框架 Swagger 文档配置选项。

7.2 配置信息#

  • SpecificationDocumentSettings:配置根节点
    • DocumentTitle:文档标题,string,默认 Specification Api Document
    • DefaultGroupName:默认分组名,string,默认 Default
    • EnableAuthorized:是否启用权限控制,bool,默认 true
    • FormatAsV2:采用 Swagger 2.0 版本,bool,默认 false
    • RoutePrefix:规范化文档地址,string,默认 api如果希望在首页,改为空字符串即可
    • DocExpansionState:文档显示方式,DocExpansion,默认 List,取值:
      • List:列表式(展开子类),默认值
      • Full:完全展开
      • None:列表式(不展开子类)
    • XmlComments:程序集注释描述文件名(可带 .xmlstring,默认 Furion.Application, Furion.Web.Entry, Furion.Web.Core
    • GroupOpenApiInfos:分组信息配置,SpecificationOpenApiInfo[],默认 { 'Group': 'Default'}
    • SecurityDefinitions:安全策略定义配置,SpecificationOpenApiSecurityScheme[],默认 []
    • Servers:配置 Server 下拉列表,OpenApiServer[] 类型,默认 [],如:{Servers:[ { Url:"地址", Description:"描述"} ]}
    • HideServers:是否隐藏 Server 下拉列表,bool 类型,默认 false

7.3 配置示例#

{
"SpecificationDocumentSettings": {
"GroupOpenApiInfos": [
{
"Group": "Group1",
"Title": "分组标题",
"Description": "这里是分组描述",
"Version": "版本号",
"TermsOfService": "https://furion.pro",
"Contact": {
"Name": "百小僧",
"Url": "https://gitee.com/monksoul",
"Email": "monksoul@outlook.com"
},
"License": {
"Name": "Apache-2.0",
"Url": "https://gitee.com/dotnetchina/Furion/blob/alpha/LICENSE"
}
}
]
}
}
Last updated on by Monk
- + diff --git a/handbook/build/docs/settings/validationTypemessagesettings/index.html b/handbook/build/docs/settings/validationTypemessagesettings/index.html index 55fd8b447c4..88ee74c6979 100644 --- a/handbook/build/docs/settings/validationTypemessagesettings/index.html +++ b/handbook/build/docs/settings/validationTypemessagesettings/index.html @@ -8,7 +8,7 @@ 3. 验证消息配置 | Furion - + @@ -22,7 +22,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

3. 验证消息配置

3.1 关于配置#

验证消息配置指的是 Furion 框架数据校验中验证类型默认消息配置选项。

3.2 配置信息#

  • ValidationTypeMessageSettings:配置根节点
    • Definitions:配置验证类型对应的消息类型,[类型名称,类型消息][] 类型,如:["Required", "值不能为空或Null"]

3.3 配置示例#

{
"ValidationTypeMessageSettings": {
"Definitions": [
["Required", "值不能为空或Null"],
["Numeric", "必须是数值类型"],
["StrongPassword", "密码太简单了!!!"]
]
}
}
Last updated on by Monk
- + diff --git a/handbook/build/docs/signalr/index.html b/handbook/build/docs/signalr/index.html index f812e980040..29ede4f0c09 100644 --- a/handbook/build/docs/signalr/index.html +++ b/handbook/build/docs/signalr/index.html @@ -8,7 +8,7 @@ 24. 即时通讯 | Furion - + @@ -32,7 +32,7 @@
public static void HttpConnectionDispatcherOptionsSettings(HttpConnectionDispatcherOptions options)
{
// 配置
}
public static void HubEndpointConventionBuilderSettings(HubEndpointConventionBuilder Builder)
{
// 配置
}
}
}

以上配置等价于 SignalRStartup.cs 中的配置:

app.UseEndpoints(endpoints =>
{
var builder = endpoints.MapHub<ChatHub>("/hubs/chathub", options =>
{
// 配置
});
});

24.7 服务端和客户端双工通信#

24.7.1 触发所有客户端代码#

Clients.All.客户端方法(参数);

24.7.2 触发调用者客户端#

Clients.Caller.客户端方法(参数);

24.7.3 触发除了调用者以外的客户端#

Clients.Others.客户端方法(参数);

24.7.4 触发特定用户客户端#

Clients.User("用户").客户端方法(参数);

24.7.5 触发多个用户客户端#

Clients.Users("用户","用户2",...).客户端方法(参数);

24.7.6 触发分组内客户端#

Clients.Group("分组").客户端方法(参数);

24.7.7 触发多个分组客户端#

Clients.Groups("分组","分组2",...).客户端方法(参数);

24.7.8 触发分组外的客户端#

Clients.GroupExcept("分组").客户端方法(参数);

24.8 自定义用户唯一标识#

24.9 分组管理#

24.10 各个客户端连接 API#

24.10.1 Javascript 客户端#

24.10.2 Tavascript 客户端#

24.10.3 .NET 客户端#

24.10.4 Java 客户端#

24.11 常见例子#

24.11.1 实现消息广播、推送#

整理中...

24.11.2 实现聊天功能#

整理中...

24.11.3 实现 你画我来猜#

整理中...

24.12 反馈与建议#

与我们交流

给 Furion 提 Issue


了解更多

想了解更多 SignalR 知识可查阅 SignalR 官方文档ASP.NET Core SignalR 章节。

Last updated on by Monk
- + diff --git a/handbook/build/docs/source/index.html b/handbook/build/docs/source/index.html index aa8176921e6..3576c221f4f 100644 --- a/handbook/build/docs/source/index.html +++ b/handbook/build/docs/source/index.html @@ -8,7 +8,7 @@ 1.3 示例结构 | Furion - + @@ -54,7 +54,7 @@
#prefer fields not to be prefaced with this. or Me. in Visual Basic
dotnet_style_qualification_for_field = false:suggestion
#prefer methods not to be prefaced with this. or Me. in Visual Basic
dotnet_style_qualification_for_method = false:suggestion
#prefer properties not to be prefaced with this. or Me. in Visual Basic
dotnet_style_qualification_for_property = false:suggestion
# Add file header
file_header_template = -----------------------------------------------------------------------------\nFur 是 .NET 5 平台下企业应用开发最佳实践框架。\nCopyright © 2020 Furion, Baiqian Co.,Ltd.\n\n框架名称:Furion\n框架作者:百小僧\n框架版本:1.0.0\n源码地址:Gitee:https://gitee.com/dotnetchina/Furion \n Github:https://github.com/monksoul/Furion \n开源协议:Apache-2.0(http://www.apache.org/licenses/LICENSE-2.0)\n-----------------------------------------------------------------------------

1.3.4 Furion 核心层#

Furion 核心层是 Furion 框架的中心,也是 Furion 能够支撑起来的必备层。

源码结构:

Furion
├─Furion.csproj
├─Furion.csproj.user
├─FurStartup.cs
├─ViewEngine
| ├─IViewEngine.cs
| ├─ViewEngine.cs
| ├─Templates
| | ├─IViewEngineCompiledTemplate.cs
| | ├─IViewEngineTemplate.cs
| | ├─ViewEngineCompiledTemplate.cs
| | └ViewEngineTemplate.cs
| ├─Options
| | └ViewEngineCompilationOptions.cs
| ├─Models
| | └AnonymousTypeWrapper.cs
| ├─Exceptions
| | ├─ViewEngineCompilationException.cs
| | └ViewEngineException.cs
| ├─Compilations
| | ├─IViewEngineCompilationOptionsBuilder.cs
| | └ViewEngineCompilationOptionsBuilder.cs
├─UnifyResult
| ├─Providers
| | ├─IUnifyResultProvider.cs
| | └RESTfulResultProvider.cs
| ├─Models
| | └RESTfulResult.cs
| ├─Filters
| | └SuccessUnifyResultFilter.cs
| ├─Extensions
| | └UnifyResultServiceCollectionExtensions.cs
├─SpecificationDocument
| ├─Options
| | └SpecificationDocumentSettingsOptions.cs
| ├─Models
| | ├─GroupOrder.cs
| | ├─SpecificationOpenApiInfo.cs
| | ├─SpecificationOpenApiSecurityRequirementItem.cs
| | └SpecificationOpenApiSecurityScheme.cs
| ├─Extensions
| | ├─SpecificationDocumentApplicationBuilderExtensions.cs
| | └SpecificationDocumentServiceCollectionExtensions.cs
| ├─Builders
| | └SpecificationDocumentBuilder.cs
| ├─Assets
| | └index-mini-profiler.html
├─ObjectMapper
| ├─Extensions
| | └ObjectMapperServiceCollectionExtensions.cs
| ├─Dependencies
| | └IObjectMapper.cs
├─LinqBuilder
| ├─Visitors
| | └ParameterReplaceExpressionVisitor.cs
| ├─Extensions
| | └LinqExtensions.cs
| ├─Builders
| | └LinqExpression.cs
├─FriendlyException
| ├─Oops.cs
| ├─Providers
| | └IErrorCodeTypeProvider.cs
| ├─Options
| | └ErrorCodeMessageSettingsOptions.cs
| ├─Models
| | └MethodIfException.cs
| ├─Filters
| | └FriendlyExceptionFilter.cs
| ├─Extensions
| | └FriendlyExceptionServiceCollectionExtensions.cs
| ├─Attributes
| | ├─ErrorCodeItemMetadataAttribute.cs
| | ├─ErrorCodeTypeAttribute.cs
| | └IfExceptionAttribute.cs
├─DynamicApiController
| ├─Penetrates.cs
| ├─Providers
| | └DynamicApiControllerFeatureProvider.cs
| ├─Options
| | └DynamicApiControllerSettingsOptions.cs
| ├─Models
| | └ParameterRouteTemplate.cs
| ├─Extensions
| | └DynamicApiControllerServiceCollectionExtensions.cs
| ├─Enums
| | └ApiSeats.cs
| ├─Dependencies
| | └IDynamicApiController.cs
| ├─Conventions
| | └DynamicApiControllerApplicationModelConvention.cs
| ├─Attributes
| | ├─ApiDescriptionSettingsAttribute.cs
| | ├─ApiSeatAttribute.cs
| | └DynamicApiControllerAttribute.cs
├─DependencyInjection
| ├─Options
| | └DependencyInjectionSettingsOptions.cs
| ├─Models
| | └ExternalService.cs
| ├─Extensions
| | └DependencyInjectionServiceCollectionExtensions.cs
| ├─Enums
| | ├─InjectionActions.cs
| | ├─InjectionPatterns.cs
| | └RegisterType.cs
| ├─Dependencies
| | ├─IPrivateDependency.cs
| | ├─IScoped.cs
| | ├─ISingleton.cs
| | ├─ITransient.cs
| | ├─Proxies
| | | └IDispatchProxy.cs
| ├─Attributes
| | ├─InjectionAttribute.cs
| | └SkipScanAttribute.cs
├─DataValidation
| ├─Validators
| | └DataValidator.cs
| ├─Providers
| | └IValidationMessageTypeProvider.cs
| ├─Options
| | └ValidationTypeMessageSettingsOptions.cs
| ├─Models
| | └DataValidationResult.cs
| ├─Filters
| | └DataValidationFilter.cs
| ├─Extensions
| | ├─DataValidationExtensions.cs
| | └DataValidationServiceCollectionExtensions.cs
| ├─Enums
| | ├─ValidationPattern.cs
| | └ValidationTypes.cs
| ├─Attributes
| | ├─DataValidationAttribute.cs
| | ├─NonValidationAttribute.cs
| | ├─ValidationItemMetadataAttribute.cs
| | ├─ValidationMessageAttribute.cs
| | ├─ValidationMessageTypeAttribute.cs
| | └ValidationTypeAttribute.cs
├─DataEncryption
| ├─AESEncryption.cs
| ├─DESCEncryption.cs
| └MD5Encryption.cs
├─DatabaseAccessor
| ├─UnitOfWork
| | ├─Filters
| | | └UnitOfWorkFilter.cs
| | ├─Attributes
| | | ├─NonTransactAttribute.cs
| | | └UnitOfWorkAttribute.cs
| ├─Repositories
| | ├─EFCoreRepository.cs
| | ├─IMSRepository.cs
| | ├─IRepository.cs
| | ├─ISqlRepository.cs
| | ├─MSRepository.cs
| | ├─SqlRepository.cs
| | ├─Implantations
| | | ├─DeletableRepository.cs
| | | ├─InsertableRepository.cs
| | | ├─OperableRepository.cs
| | | ├─ReadableRepository.cs
| | | ├─SqlExecutableRepository.cs
| | | ├─SqlReaderRepository.cs
| | | ├─UpdateableRepository.cs
| | | └WritableRepository.cs
| | ├─Dependencies
| | | ├─IDeletableRepository.cs
| | | ├─IInsertableRepository.cs
| | | ├─IOperableRepository.cs
| | | ├─IReadableRepository.cs
| | | ├─IRepositoryDependency.cs
| | | ├─ISqlExecutableRepository.cs
| | | ├─ISqlReaderRepository.cs
| | | ├─IUpdateableRepository.cs
| | | └IWritableRepository.cs
| ├─Pools
| | ├─DbContextPool.cs
| | └IDbContextPool.cs
| ├─MultiTenants
| | ├─Locators
| | | └MultiTenantDbContextLocator.cs
| | ├─Enums
| | | └MultiTenantOptions.cs
| | ├─Entities
| | | └Tenant.cs
| | ├─Dependencies
| | | ├─IMultiTenantOnDatabase.cs
| | | ├─IMultiTenantOnSchema.cs
| | | ├─IMultiTenantOnTable.cs
| | | └IPrivateMultiTenant.cs
| ├─Models
| | ├─DbProvider.cs
| | ├─PagedList.cs
| | ├─ProcedureOutputResult.cs
| | ├─ProcedureOutputValue.cs
| | ├─SqlTemplate.cs
| | └SqlTemplateParameter.cs
| ├─Locators
| | ├─IDbContextLocator.cs
| | └MasterDbContextLocator.cs
| ├─Interceptors
| | ├─DbContextSaveChangesInterceptor.cs
| | ├─SqlCommandProfilerInterceptor.cs
| | └SqlConnectionProfilerInterceptor.cs
| ├─Helpers
| | └DbHelpers.cs
| ├─Extensions
| | ├─DatabaseAccessorServiceCollectionExtensions.cs
| | ├─PagedQueryableExtensions.cs
| | ├─Repositories
| | | ├─IEntityExtensions.cs
| | | ├─IEntityWithDbContextLocatorExtensions.cs
| | | └SqlExtensions.cs
| | ├─DatabaseProvider
| | | ├─DatabaseProviderServiceCollectionExtensions.cs
| | | └Penetrates.cs
| | ├─DatabaseFacade
| | | ├─DbDataConvertExtensions.cs
| | | ├─DbObjectExtensions.cs
| | | └SqlAdoNetExtensions.cs
| ├─Enums
| | ├─DbFunctionType.cs
| | ├─EFCoreErrorCodes.cs
| | └ManualOptions.cs
| ├─Entities
| | ├─Dependencies
| | | ├─Entity.cs
| | | ├─EntityBase.cs
| | | ├─EntityNotKey.cs
| | | ├─IEntity.cs
| | | └IEntityNotKey.cs
| | ├─Configures
| | | ├─IEntitySeedData.cs
| | | ├─IEntityTypeBuilder.cs
| | | ├─IModelBuilderFilter.cs
| | | └IPrivateModelBuilder.cs
| | ├─Attributes
| | | ├─FakeDeleteAttribute.cs
| | | ├─NonAutomaticAttribute.cs
| | | └QueryableFunctionAttribute.cs
| ├─DynamicModels
| | ├─DynamicModelCacheKeyFactory.cs
| | └IEntityMutableTable.cs
| ├─Contexts
| | ├─AppDbContext.cs
| | ├─Builders
| | | ├─AppDbContextBuilder.cs
| | | ├─Models
| | | | └DbContextCorrelationType.cs
| | ├─Attributes
| | | └AppDbContextAttribute.cs
| ├─Attributes
| | └DbParameterAttribute.cs
| ├─Advances
| | ├─Proxies
| | | └SqlDispatchProxy.cs
| | ├─Models
| | | └SqlProxyMethod.cs
| | ├─Dependencies
| | | └ISqlDispatchProxy.cs
| | ├─Attributes
| | | ├─SqlExecuteAttribute.cs
| | | ├─SqlFunctionAttribute.cs
| | | ├─SqlProcedureAttribute.cs
| | | ├─Basics
| | | | ├─SqlObjectProxyAttribute.cs
| | | | ├─SqlProxyAttribute.cs
| | | | └SqlSentenceProxyAttribute.cs
├─CorsAccessor
| ├─Options
| | └CorsAccessorSettingsOptions.cs
| ├─Extensions
| | ├─CorsAccessorApplicationBuilderExtensions.cs
| | └CorsAccessorServiceCollectionExtensions.cs
├─ConfigurableOptions
| ├─Options
| | └IConfigurableOptions.cs
| ├─Extensions
| | └ConfigurableOptionsServiceCollectionExtensions.cs
| ├─Attributes
| | └OptionsSettingsAttribute.cs
├─Authorization
| ├─Penetrates.cs
| ├─Requirements
| | └AuthorizePolicyRequirement.cs
| ├─Providers
| | └AuthorizePolicyProvider.cs
| ├─Options
| | └JWTSettingsOptions.cs
| ├─Handlers
| | └AuthorizePolicyHandler.cs
| ├─Extensions
| | └PolicyAuthorizationServiceCollectionExtensions.cs
| ├─Attributes
| | └AuthorizePolicyAttribute.cs
├─App
| ├─App.cs
| ├─Startups
| | ├─AppStartup.cs
| | └HostingStartup.cs
| ├─Options
| | └AppSettingsOptions.cs
| ├─Filters
| | └StartupFilter.cs
| ├─Extensions
| | ├─AppApplicationBuilderExtensions.cs
| | ├─AppServiceCollectionExtensions.cs
| | ├─WebHostBuilderExtensions.cs
| | ├─Types
| | | └ObjectExtensions.cs
| ├─Attributes
| | └AppStartupAttribute.cs

1.3.5 Furion.Application 业务应用层#

Furion.Application 业务应用层是最常用的层,几乎所有的业务代码都在这个层中编写。

源码结构:

Furion.Application
├─Furion.Application.Core.csproj
├─Furion.Application.Core.xml
└FurApplicationStartup.cs

1.3.6 Furion.Core 仓储实体层#

Furion.Core 主要是存储自定义仓储和定义实体的层。

源码结构:

Furion.Core
├─Furion.Core.csproj
└FurCoreStartup.cs

1.3.7 Furion.Database.Migrations 数据库架构维护层#

Furion.Database.Migrations 主要是用来存放 Database FirstCode First 生成的维护文件。

源码结构:

Furion.Database.Migrations
└Furion.Database.Migrations.csproj

1.3.8 Furion.EntityFramework.Core 数据库上下文配置层#

Furion.EntityFramework.Core 主要是用来配置数据库上下文和其他数据库相关配置信息的。

源码结构:

Furion.EntityFramework.Core
└Furion.EntityFramework.Core.csproj

1.3.9 Furion.Web.Core 应用核心层#

Furion.Web.Core 主要是用来配置 Web 入口一些代码,如 FilterMiddlewares 等。

源码结构:

Furion.Web.Core
├─Furion.Web.Core.xml
└FurWebCoreStartup.cs

1.3.10 Furion.Web.Entry 应用入口层#

Furion.Web.Entry 是我们的应用层,也就是我们的 Web 项目层,发布层。

源码结构:

Furion.Web.Entry
├─appsettings.Development.json
├─appsettings.json
├─Furion.Web.Entry.csproj
├─Furion.Web.Entry.csproj.user
├─Furion.Web.Entry.xml
├─Program.cs
├─Startup.cs
├─wwwroot
| └README.md
├─Properties
| └launchSettings.json
├─Controllers
Last updated on by Monk
- + diff --git a/handbook/build/docs/specification-document/index.html b/handbook/build/docs/specification-document/index.html index c55d7ab799d..05754db782f 100644 --- a/handbook/build/docs/specification-document/index.html +++ b/handbook/build/docs/specification-document/index.html @@ -8,7 +8,7 @@ 6. 规范化接口文档 | Furion - + @@ -56,7 +56,7 @@
/// <summary>
/// 处理输出状态码
/// </summary>
/// <param name="context"></param>
/// <param name="statusCode"></param>
/// <returns></returns>
public async Task OnResponseStatusCodes(HttpContext context, int statusCode)
{
switch (statusCode)
{
// 处理 401 状态码
case StatusCodes.Status401Unauthorized:
await context.Response.WriteAsJsonAsync(new RESTfulResult<object>
{
StatusCode = StatusCodes.Status401Unauthorized,
Succeeded = false,
Data = null,
Errors = "401 Unauthorized",
Extras = UnifyContext.Take(),
Timestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()
});
break;
// 处理 403 状态码
case StatusCodes.Status403Forbidden:
await context.Response.WriteAsJsonAsync(new RESTfulResult<object>
{
StatusCode = StatusCodes.Status403Forbidden,
Succeeded = false,
Data = null,
Errors = "403 Forbidden",
Extras = UnifyContext.Take(),
Timestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()
});
break;
default:
break;
}
}
}
}

之后在 Startup.cs 中注册即可:

services.AddControllers()
.AddInjectWithUnifyResult<RESTfulResultProvider>();
特别注意

默认情况下,规范化结果不会对 401403 状态码进行规范化处理,如需启动该状态码处理,只需在 Startup.cs 中的 Configure 中启用接口:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
// 添加规范化结果状态码,需要在这里注册
app.UseUnifyResultStatusCodes();
// 其他注册...
}

6.7.1 排除规范化处理#

有些时候,我们某些接口不需要进行规范化处理,这时,我们只需要帖 [NonUnify] 特性即可。

6.7.2 规范化结果添加额外数据#

默认的规范化结果中包含 extras 属性,可以配置额外数据返回到客户端:

UnifyContext.Fill(new { Message = "操作成功" });

6.7.3 自定义特别接口规范化结果#

有些时候,我们特定接口需返回特定的接口类型,无需规范化处理,这时候我们只需要贴 [UnifyResult(typeof(结果类))][ProducesResponseType(typeof(结果类),200)],如:

[UnifyResult(typeof(Person))]
public Person GetPerson(int id)
{
// ...
}

6.8 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by Monk
- + diff --git a/handbook/build/docs/split-db/index.html b/handbook/build/docs/split-db/index.html index 23ae8064552..e76a56d56c4 100644 --- a/handbook/build/docs/split-db/index.html +++ b/handbook/build/docs/split-db/index.html @@ -8,7 +8,7 @@ 9.28 分表分库 | Furion - + @@ -25,7 +25,7 @@ 例如按时间字段分片,有些分片存储最近时间段内的数据,可能会被频繁的读写,而有些分片存储的历史数据,则很少被查询

9.28.4.3 一致性 Hash 算法#

一致性 Hash 算法能很好的解决因为 Hash 取模而产生的分片集群扩容时,需要迁移旧的数据的难题。具体原理可参考 https://www.cnblogs.com/duhuo/p/4996105.html

9.28.5 分库分表带来的问题#

任何事情都有两面性,分库分表也不例外,如果采用分库分表,会引入新的的问题:

9.28.5.1 分布式事务问题#

使用分布式事务中间件解决,具体是通过最终一致性还是强一致性分布式事务,看业务需求,这里就不多说。

9.28.5.2 跨节点关联查询 Join 问题#

切分之前,我们可以通过 Join 来完成。而切分之后,数据可能分布在不同的节点上,此时 Join 带来的问题就比较麻烦了,考虑到性能,尽量避免使用 Join 查询。

解决这个问题的一些方法:

  • 全局表

全局表,也可看做是 "数据字典表",就是系统中所有模块都可能依赖的一些表,为了避免跨库 Join 查询,可以将 这类表在每个数据库中都保存一份。这些数据通常很少会进行修改,所以也不担心一致性的问题。

  • 字段冗余

利用空间换时间,为了性能而避免 join 查询。例:订单表保存 userId 时候,也将 userName 冗余保存一份,这样查询订单详情时就不需要再去查询"买家 user 表"了。

  • 数据组装

在系统层面,分两次查询。第一次查询的结果集中找出关联数据 id,然后根据 id 发起第二次请求得到关联数据。最后将获得到的数据进行字段拼装。

9.28.5.3 跨节点分页、排序、函数问题#

跨节点多库进行查询时,会出现 Limit 分页、Order by 排序等问题。分页需要按照指定字段进行排序,当排序字段就是分片字段时,通过分片规则就比较容易定位到指定的分片;

当排序字段非分片字段时,就变得比较复杂了。需要先在不同的分片节点中将数据进行排序并返回,然后将不同分片返回的结果集进行汇总和再次排序,最终返回给用户。

9.28.5.4 全局主键避重问题#

如果都用主键自增肯定不合理,如果用 UUID 那么无法做到根据主键排序,所以我们可以考虑通过雪花 ID 来作为数据库的主键,

9.28.5.5 数据迁移问题#

采用双写的方式,修改代码,所有涉及到分库分表的表的增、删、改的代码,都要对新库进行增删改。同时,再有一个数据抽取服务,不断地从老库抽数据,往新库写,

边写边按时间比较数据是不是最新的。

9.28.6 如何实现#

特别说明

由于分表分库不仅仅需要内置代码的支持,同时还需要集成数据库中间件,这里推荐 MyCat 中间件。MyCat 官方网站

Furion 框架中提供了轻量级的 分表分库 支持:

  • 动态切换数据库
// 直接改变数据库
repository.ChangeDatabase("数据库连接字符串");
// 通过数据库上下文定位器切换
repository.Change<Entity, MyDbContextLocator2>();

如需跨库查询,需用到数据库技术,如 SqlServer 链接服务器或同义词。

  • 动态切换数据库表

第一步、配置数据库上下文特性[AppDbContext( Mode=DbContextMode.Dynamic)]

第二步、需要动态修改表名的实体继承 IEntityMutableTable<TEntity> 接口,并实现 GetTableName() 返回表名方法

最后通过 BuildChange<TEntity> 切换即可。

var rep = repository.BuildChange<Persion>();

调用 BuildChange 方法之后会自动调用 GetTableName() 方法。

了解更多

想了解更多 DynamicModelCacheKeyFactory 知识可查阅 EF Core - 多个模型之间交替 章节。

9.28.7 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by 我乖的阔爱
- + diff --git a/handbook/build/docs/sqlsugar/index.html b/handbook/build/docs/sqlsugar/index.html index 7b5d9f6ae91..debf600d75e 100644 --- a/handbook/build/docs/sqlsugar/index.html +++ b/handbook/build/docs/sqlsugar/index.html @@ -8,7 +8,7 @@ 10.1. SqlSugar 集成 | Furion - + @@ -42,7 +42,7 @@
//存储过程用法
var nameP= new SugarParameter("@name", "张三");
var ageP= new SugarParameter("@age", null, true);//设置为output
var dt = db.Ado.UseStoredProcedure().GetDataTable("sp_school",nameP,ageP);
方法名描述返回值
SqlQuery< T >查询所有返回实体集合List
SqlQuery<T,T2>可以返回 2 个结果集Tuple<List, List>
SqlQuerySingle查询第一条记录T
GetDataTable查询所有DataTable
GetDataReader读取 DR 需要手动释放 DRDataReader
GetDataSetAll获取多个结果集DataSet
ExecuteCommand返回受影响行数,一般用于增删改int
GetScalar获取首行首列object
GetString获取首行首列string
GetInt获取首行首列int
GetLong获取首行首列long
GetDouble获取首行首列Double
GetDecimal获取首行首列Decimal
GetDateTime获取首行首列DateTime

想了解更多 SqlSugar 知识可查阅 SqlSugar 官网

10.1.7 打印 sqlSwagger#

services.AddSqlSugar(new ConnectionConfig
{
ConnectionString = "Server=.xxxxx",//连接符字串
DbType = DbType.SqlServer,
IsAutoCloseConnection = true,
InitKeyType = InitKeyType.Attribute//从特性读取主键自增信息
},
db =>
{
db.Aop.OnLogExecuting = (sql, pars) =>
{
App.PrintToMiniProfiler("SqlSugar", "Info", sql + "\r\n" +string.Join(",", pars?.Select(it => it.ParameterName + ":" + it.Value)));
};
});

10.1.8 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by Monk
- + diff --git a/handbook/build/docs/template/index.html b/handbook/build/docs/template/index.html index f1859d84c7a..33ac155efdd 100644 --- a/handbook/build/docs/template/index.html +++ b/handbook/build/docs/template/index.html @@ -8,7 +8,7 @@ 2.2 官方脚手架 | Furion - + @@ -22,7 +22,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

2.2 官方脚手架

特别说明

脚手架不是安装在项目中的! 而是通过 CMDPowerShell 安装到操作系统中的。

2.2.1 脚手架#

Furion 官方提供了多种 Web 应用类型的脚手架,方便大家快速创建多层架构项目。目前支持以下应用脚手架:

模板类型名称版本关键词描述
nugetFurion.Template.Mvcnuget👉 furionmvcMvc 模板
nugetFurion.Template.Apinuget👉 furionapiWebApi 模板
nugetFurion.Template.Appnuget👉 furionappMvc/WebApi 模板
nugetFurion.Template.Razornuget👉 furionrazorRazorPages 模板
nugetFurion.Template.RazorWithWebApinuget👉 furionrazorapiRazorPages/WebApi 模板
nugetFurion.Template.Blazornuget👉 furionblazorBlazor 模板
nugetFurion.Template.BlazorWithWebApinuget👉 furionblazorapiBlazor/WebApi 模板

2.2.2 安装脚手架#

打开 CMDPowershell 执行模板安装命令:

dotnet new --install Furion.Template.Mvc::1.15.0

2.2.3 使用脚手架#

dotnet new furionmvc -n 项目名称

这样就可以生成项目代码了,生成之后推荐将所有的 nuget 包更新到最新版本。

特别提醒

furionmvc 对应的是上面列表的 关键字,我们也可以通过 dotnet new --list 查看。

想了解更多可以使用 dotnet new 关键字 --help 查看更多参数。

2.2.4 脚手架更新#

只需要重新安装最新版替换即可,如:

dotnet new --install Furion.Template.Mvc::1.x.x

不带版本号总是安装最新的版本。

2.2.5 反馈与建议#

与我们交流

给 Furion 提 Issue


了解更多

想了解更多 模板知识 知识可查阅 dotnet-new 模板 章节。

Last updated on by Monk
- + diff --git a/handbook/build/docs/tran/index.html b/handbook/build/docs/tran/index.html index 1f100758e59..db824c9a504 100644 --- a/handbook/build/docs/tran/index.html +++ b/handbook/build/docs/tran/index.html @@ -8,7 +8,7 @@ 9.26 事务和工作单元 | Furion - + @@ -34,7 +34,7 @@
// 框架封装的仓储
_testRepository.Insert(new Blog { Url = "http://blogs.msdn.com/dotnet" });
_testRepository.SaveChanges();
// 提交事务
scope.Complete();
}
catch (System.Exception)
{
// 自动回滚
}
}
}

9.26.4 工作单元特性说明#

9.26.4.1 [UnitOfWork]#

[UnitOfWork] 特性用来标记事务信息,如作用范围,隔离级别等。

  • Enabled:是否启动工作单元,默认 true
  • ScopeOption:定义事务范围行为,默认 TransactionScopeOption.Required
  • IsolationLevel:设置事务隔离级别,默认 IsolationLevel.ReadCommitted;
  • AsyncFlowOption:允许跨线程连续任务的事务流,如有异步操作需开启该选项,默认开启
特别注意

一旦方法贴了 [UnitOfWork(false)] 特性后,那么该方法不再启用工作单元模式,也就是不包含事务,也不会自动提交数据库。慎用!

9.26.5 反馈与建议#

与我们交流

给 Furion 提 Issue


了解更多

想了解更多 事务 知识可查阅 EF Core - 使用事务 章节。

Last updated on by Monk
- + diff --git a/handbook/build/docs/unittest/index.html b/handbook/build/docs/unittest/index.html index ebebffaa48b..26f27299b6d 100644 --- a/handbook/build/docs/unittest/index.html +++ b/handbook/build/docs/unittest/index.html @@ -8,7 +8,7 @@ 29.1 单元测试 | Furion - + @@ -22,7 +22,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️
Last updated on by Monk
- + diff --git a/handbook/build/docs/upgrade/index.html b/handbook/build/docs/upgrade/index.html index f1e8967c55d..22bfa27ba24 100644 --- a/handbook/build/docs/upgrade/index.html +++ b/handbook/build/docs/upgrade/index.html @@ -8,7 +8,7 @@ 1.6 更新日志 | Furion - + @@ -16,13 +16,13 @@ - +
-
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

1.6 更新日志

此章节只记录重大版本更新日志,小迭代版本不做更新。想了解更多更新内容,可查阅 CHANGELOG.md

v1.16.0 (当前版本)#

  • 新特性

    • [新增] IDGenerator 雪花 ID 算法,感谢 idgenerator 作者提交 PR #PR204 #I3B60S
    • [新增] DbContext 刷新多租户缓存拓展方法 #I39N5U
    • [新增] 自定义配置单个控制器名称规范,如小写路由 #I3A5XL
    • [新增] 获取当前选择区域语言方法 #I3BSDH
  • 突破性变化

    • [升级] .NET 5 SDK 至 5.0.4 版本 #I3ASTL
    • [重构] 远程请求所有功能 #I2LB7M
    • [重构] JSON 序列化功能,提供统一的抽象接口,方便自由替换 JSON#I39GT9
    • [重构] 验证失败返回消息模型及规范化接口验证参数 #I3AFQW
    • [优化] 插件式开发热插拔功能,实现动态加载卸载 #PR200, 感谢 @SamWangCoder
    • [移除] 移除 JsonSerializerUtility 静态类及移除属性大写序列化拓展配置 #I3AFRJ
  • 问题修复

    • [修复] MVC 模式下不支持验证自定义验证逻辑 #I39LM5
    • [修复] 验证数值类型正则表达式不支持负数 bug #I39YUV
    • [修复] 框架启动时无法加载未被引用的程序集 bug #I3A3Z4
    • [修复] EFCoreRepository.IsAttached() 方法判断错误 bug #I3A824
    • [修复] 动态API 驼峰显示配置无效 bug #I3AF32
    • [修复] cli.ps1 不支持新版本 EFCore bug #I3APO9
    • [修复] EFCore 实体配置 [Table] 特性无效 bug #I3BAYH
    • [修复] 动态 WebAPI CheckIsSplitCamelCase bug #I3BLKX
    • [修复] 修复动态 WebAPI 配置保留 Action 的 Async 后缀无效问题 #I3C3DA
    • [修复] JWT Token 刷新后旧的刷新 Token 依旧可用 bug #I3C8ZH
    • [修复] 多语言 Razor 视图变量多语言乱码问题 #I3CBMU
  • 其他更改

    • [优化] 默认序列化提供器 System.Text.Json 反序列化字符串时区分大小写问题 #I3BSXV
    • [优化] 优化 MessageCenter 性能问题 #I39PRR
    • [优化] 数据库上下文池小性能优化
  • 文档变化

    • [新增] Docker 环境下自动化部署 #PR209
    • [新增] JSON 序列化 文档 #I3B6D8
    • [更新] 跨域、安全授权、即时通信文档、多语言、规范化文档
  • 问答答疑

    • [答疑] Furion.Extras.DatabaseAccessor.SqlSugar 配置多个数据库打印 SQL 语句问题 #I39PDC
    • [答疑] ORACLE 数据库多租户模式下返回值为指定类型时系统卡死 #I39RNH
    • [答疑] 假删除指向异常 #I39XZA
    • [答疑] Furion 多语言配置节是放在 AppSettings 里面还是外面呢? #I3A4SB
    • [答疑] 没找到数据库上下文 #I3A5HS
    • [答疑] 有 QQ 交流群吗? #I3AAM7
    • [答疑] Vue3 环境下配置 SignalR 跨域出错 #I3ALQ7
    • [答疑] 设置 Swagger 参数非必填 #I3AT02
    • [答疑] EFCore 调用 Insert 时报 Unknown column 'Discriminator' in 'field list' 异常 #I3B2LC
    • [答疑] 逆向 mysql 数据库时 cli 出现错误 #I3B64F
    • [答疑] Sql 高级代理使用过程中 DateTime 类型的参数序列化失败 #I3AZXK
    • [答疑] 使用 Mysql 执行 Add-Migration 报错 #I3B8EW
    • [答疑] Saas 多租户模式-独立 Database 模式下无法获取 Tenant, 导致无法自动切换的问题#I3AVXU
    • [答疑] 如何自定义 WebAPI 统一结果模型 #I3BBYW #I3BBYV
    • [答疑] 在 Web.Entry 项目新建了一个 Controller,多了未知方法 #I3BKH5
    • [答疑] AOP 拦截如何解析服务 #I3BUM3
    • [答疑] 动态 WebAPI 返回参数被省略 #I3C2XR
    • [答疑] 如何设置某一个接口响应数据不自动转小写,按原始字段名返回 #I38L9B
    • [答疑] code first 如何配置自动迁移 #I3CCR0
    • [答疑] webapi 混合授权如何区分不同系统 #I3CJCY
    • [答疑] EFCore 不支持递归无限级遍历关系 #I3CET9
  • 不做实现

    • [废弃] 建议 EFCore 可配置外键关系导航问题 #I3994X
    • [废弃] 建议将 EFCore 剥离出来,作为插件的形式提供。这样可以选择自己喜欢的 ORM #I3ABNX
    • [废弃] 事件总线能否提供返回值 #I3AWL6
    • [废弃] Sql 模板能仿照 Mybatis 一样加各种标签吗?#I3ASRS
    • [废弃] EFCore 更新或排除更新指定列支持传入 DTO 模型 #I3AS5K
    • [废弃] 新增 UnitOfWork 事务完成事件 #I3BRMI

v1.15.0 (已发布)#

  • 新特性

    • [新增] 跳过特定实体数据库操作监听特性 #I386LB
    • [新增] IEntityChangedListener 增加对 OldEntity 的支持 #I385X2
    • [新增] 实时通信自动配置集线器拓展及特性 #I387QX
    • [新增] Mapster 拓展支持 IMapper 依赖注入方式 #I38C7C
    • [新增] [AppDbContext] 特性默认构造函数 #I38J97
    • [新增] UnifyContext.GetExceptionMetadata(context) 返回错误码支持 #I38ONX
  • 突破性变化

  • 问题修复

    • [修复] 多次循环中调用 Db.GetNewDbContext() 还是获取到同一个对象 #I38NNP
    • [修复] Swagger 过滤掉 object 类型属性问题 #I38FHL
    • [修复] 同一类不支持多继承 IEntityChangedListener 问题 #I38UQJ
    • [修复] 自定义序列化属性名称导致验证失败属性不匹配问题 #I38W8Z
  • 其他更改

    • [优化] 代码不规范命名导致开发者阅读代码时产生歧义
  • 文档变化

    • [新增] FluentValidation 集成文档 #I38IOT
  • 问答答疑

    • [答疑] Furion 框架版本向下兼容问题 #I38WMZ
  • 不做实现

    • [废弃] 建议 SqlSugar 添加动态切换数据库功能 #I38G4M
    • [废弃] 建议 MessageCenter 采用 Channel 实现 #I38BP8
    • [废弃] 建议接口文档整合 Knife4jUI 或 Redoc #I38S70

v1.14.0(已发布)#

  • 新特性

    • [新增] EFCore 5.0 的 Oracle 数据库支持 #I37Z8E
    • [新增] 控制是否在开发环境下显示数据库连接信息 #I37YQ2
    • [新增] [NonUnify] 支持在类中贴此特性 #I359Q6
    • [新增] 网络请求 字符串 HttpClient 拦截器 #I35F3E
    • [新增] HttpContextHttpRequest 获取远程地址拓展 #I3688Z
    • [新增] services.AddMvcFilter<> 添加 Mvc 过滤器拓展 #I368BH
  • 突破性变化

    • [升级] 框架依赖的 .NET 5 SDK 至最新版 5.0.3 #I37YQQ
    • [升级] Swashbuckle.AspNetCore 组件包到 6.0.x 版本 #I37EZK
    • [移除] Furion 框架 JWT 拓展类,只在 Furion.Extras.Authentication.JwtBearer 中保留 #I35D59
  • 问题修复

    • [修复] 传入错误 JWT Token 字符串导致自动刷新 Token 出现字符串边界值异常 bug #I34ZE5
    • [修复] 瞬时作用域数据库上下文也会自动加入工作单元导致写日志时连锁异常 bug #I37WTV
  • 其他更改

    • [优化] 获取系统环境参数的性能 #I36SR5
    • [优化] Furion 底层添加 Mvc 过滤器代码 #I36SKA
    • [优化] 添加默认 Json 序列化时间默认时间格式 #I36SL0
    • [升级] 升级 SqlSugar 拓展包到 5.0.2.6 版本 #I36SIG
  • 文档变化

    • [新增] 数据库入门文档 #I37Z8S
    • [新增] 更新日志文档 #I36PI0
    • [新增] 请求审计日志、执行 Sql 更新日志文档 #I36PIK
    • [新增] 前端使用 axios 跨域配置文档 #I36PIT
    • [新增] App 静态类获取应用、环境更多信息数据 #I36SOV
    • [新增] 英文版 README.md 介绍 #I37QHP
  • 问答答疑

  • 不做实现

    • [废弃] 多语言资源文件自动创建 #I35AA4
    • [废弃] 建议多语言加上维吾尔语支持 #I37X1L

v1.13.0(已发布)#

  • 新特性

    • [新增] 多语言功能及拓展 #I2DOCL
    • [新增] 事件总线功能及消息中心 #I23BKN
    • [新增] Swagger 分组显示隐藏配置 #I2AHH8
    • [新增] Furion.Extras.Logging.Serilog 拓展插件 #I2AAN8
    • [新增] cli.ps 支持 -Namespace 命名空间指定 #I2A175
    • [新增] Swagger 规范化化文档授权失效后自动取消授权锁 #I2AIWC
    • [新增] Request.Body 支持重复读功能,主要解决微信 SDK 问题 #I2AMG0
    • [新增] 网络请求功能及文档 #I2APGJ
    • [新增] SqlSugar 拓展包支持打印 sqlMiniProfiler#I2ASLS
    • [新增] Furion.Extras.DatabaseAccesssor.Dapper 拓展插件 #I2ASYA
    • [新增] Furion.Extras.DatabaseAccessor.PetaPoco 拓展插件 #I2AUGA
    • [新增] 网络请求字符串拓展方法 #I2CPQ0
    • [新增] SqlSugar 拓展新增 PagedList 拓展 #I2CW99
    • [新增] 远程请求支持参数特性验证 #I2CX5L
    • [新增] App.User 获取当前授权用户信息便捷方法 #I2CZLO
    • [新增] 规范化文档可配置功能,支持 appsettings.json 配置 #I2D1K9
    • [新增] 远程请求拦截器添加方法和方法参数 #I2D2CM
    • [新增] 远程请求出错返回默认值支持 #I2D44M
    • [新增] 远程请求 body 参数序列化支持设置 PropertyNamingPolicy #I2D685
    • [新增] 远程服务接口客户端配置 #I2D7PS
    • [新增] AddInjectUseInject 允许自定义 SecurityDefinitionsSwaggerUI #I2DIMG
    • [新增] [SecurityDefine] 默认构造函数 #I2DNXT
    • [新增] AspectDispatchProxy 动态代理类 #I2DO6I
    • [新增] [QueryParameters] 特性,支持一键将 Action 参数添加 [FromQuery] 特性 #I2G8TF
    • [新增] 动态日志配置及拓展方法 #I2GDGD
    • [新增] WebApi 请求谓词默认规则配置功能 #I2M70X
  • 突破性变化

    • [升级] .NET 5 SDK 到 .NET 5.0.2 版本 #I2D0PZ
    • [调整] 框架内所有拓展类命名空间,全部迁移到 Furion.模块.Extensions#I2AH54
    • [调整] Swagger 记住授权存储方式,替换 Session 存储方式为 LocalStorage 方式 #I2AKUA
    • [调整] Furion 框架包描述文件,减少框架体积 #I2APAU
    • [调整] App.CanBeScanTypesApp.EffectiveTypes #I2B0ZR
    • [调整] App.ServiceProvider 属性并移除 App.GetDuplicateXXX 方法 #I2CYZE
    • [调整] Db.GetDuplicateDbContextDb.GetNewDbContext #I2CZ04
    • [调整] Db.GetSqlDispatchProxyDb.GetSqlProxy #I2DO9T
    • [重构] Aop 服务拦截器,支持异步、同步两种方式 #I2B9HQ
    • [重构] 网络请求所有功能 #I2BMR7
  • 问题修复

    • [修复] Swagger 规范化化结果不一致 bug #I2ACF3
    • [修复] 数据库新增或更新忽略空值操作方法报空异常 #I2AB6C
    • [修复] Startup.cs Aop 全局拦截无效 #I2A7T2
    • [修复] Token 过期后自动刷新 Token 无法获取最新的用户信息 bug #I2AWQI
    • [修复] [ApiDescriptionSettings(Tag="xx")] 导致 swagger.json 报错 bug #I2B47R
    • [修复] Mysql sql 数据库查询结果 tinyint 类型转换出错 bug #I2BEBM
    • [修复] 规范化结果多次包裹类型 bug #I2BHHZ
    • [修复] 动态 Api 基元类型数组问题 #I2BMS5
    • [修复] sql 查询枚举类型转换异常 bug #I2BS2Y
    • [修复] string.SqlQuerizeAsync<T1>() 拓展返回错误 bug #I2BSTS
    • [修复] 动态 Api 子类重写父类方法并取别名后 Swagger 异常 bug #I2C9VP
    • [修复] 网络请求 application/json 序列化大小写问题 #I2CRJC
    • [修复] 多数据库定位器实体嵌套关联 bug #I2CVN0
    • [修复] 跨域响应头设置无效 bug #I2CW5T
    • [修复] 远程网络请求代理打印到 MiniProfiler bug #I2CZBC
    • [修复] 远程请求响应拦截器 bug #I2D4DG
    • [修复] SqlSugar 框架 AsQueryable() 一直追加参数 #I2DH1D
    • [修复] 自动刷新 Token 空异常 bug #I2DO29
    • [修复] 生成 JWT Token 不传过期时间出现验证 401 bug #I2DO8L
    • [修复] AppStartup 排序无效 #I2DVD2
    • [修复] 未启用多语言服务时友好异常和验证出现空异常 #I2ECUJ
    • [修复] 数据校验字母和数字组合无法匹配 bug #I2EF2Q
    • [修复] 数据校验手机或固话无效 bug #I2M5IZ
    • [修复] Dapper 拓展解析 SqlConnection 异常 bug #I2M5P2
    • [修复] 开启多语言后,EF 迁移异常 bug #I2M7DT
    • [修复] IEntityTypeBuilder 不支持多重继承 bug #I2PAOD
    • [修复] JwtHandler 设置自动刷新后,匿名访问无法通过 bug #I2SDOX
    • [修复] Dapper 拓展中 SqlServer 数据库获取连接对象类型 bug #PR159
  • 其他更改

    • [优化] 移除 Sql 查询结果映射检查 [NotMapper] 特性机制 #I34XD0
    • [优化] 依赖注入时排除 IDynamicApiController 接口 #I2ECTG
    • [优化] MD5 加密性能 #PR158
  • 文档变化

    • [重构] 文档首页 #I34XBR
    • [新增] 网络请求文档 #I2APGJ
    • [新增] 多语言文档 #I2DOCL
    • [新增] 文档全文搜索引擎 #I34XAW
    • [新增] 全局静态类类型 #I34XB4
    • [新增] 框架可配置选项文档 #I34XB9
    • [新增] 事件总线文档 #I34XBI
    • [新增] 数据加解密文档 #I34XC0
    • [新增] 贡献指南文档 #I34XC8
    • [新增] HttpContext文件上传下载 博客文章 #I34XCB
    • [其他] 文档小调整,小优化
  • 问答答疑

    • [答疑] 跨域设置无效 #I2ASNJ
    • [答疑] MVC 视图无效,原因是 .cshtml 文件没有设置为 内容 #I2AXUU
    • [答疑] Sql 操作可以实现事务吗?#I2B0NX
    • [答疑] IRepository 操作数据库会打开多次数据库连接 #I2BB7B
    • [答疑] 如何进入自定义 AppAuthorizeHandler 断点 #I2BGXY
    • [答疑] SqlSugar 注入问题 #I2C2AQ
    • [答疑] 建议增加 API 签名验证,时效验证 #I2C6ET
    • [答疑] 多数据库多租户同时使用 Add-Migration 报错 #I2CEHS
    • [答疑] ISqlSugarRepository 没有 Getxxx 方法 #I2CJLZ
    • [答疑] cli.ps1 如何将 sql 里的表导出成 model#I2CSUL
    • [答疑] 手动修改 Swagger 终结点路径无效 #I2D608
    • [答疑] DefaultDbContext 不能识别 #I2DCZX
    • [答疑] 各分层项目 Startup.cs 支持 Configuration #I2DDUP
    • [答疑] Aop 无法拦截,无效 #I2DEY8
    • [答疑] mysql 执行 Add-Migration 报错 #I2DSB8\
    • [答疑] Entity 创建时间和是否删除添加默认值 #I2E04H
    • [答疑] swagger 中多个 servers 设置 #I2E0IF
    • [答疑] 全局筛选器 没有执行 #I2E5R4
    • [答疑] 多数据库定位器疑问 #I2E77T
    • [答疑] cli.ps 逆向工程 Mysql 数据库报错 #I2E7I5
    • [答疑] Swagger 开发环境 applicationsettings.json 中文乱码 #I2EAG1
    • [答疑] 增加指定路径程序集映射 #I2EEO2
    • [答疑] 动态编译 cs 脚本文件 #I2EH66
    • [答疑] 自定义中间件,返回的错误没有规范化结果 #I2NV8S
    • [答疑] Swagger 循环引用设置生成文档层级无效 #I2PLQQ
    • [答疑] 配置文件支持 yaml 文件吗? #I2TJ3N
    • [答疑] 修改数据库未 mysql 执行 Add-Migration 报错 #I2VR64
    • [答疑] 多数据库使用定位器时报错 #I2VR8F
    • [答疑] Migration To Oracle 异常 #I2WBYQ
    • [答疑] 开发时显示 Swagger,上线时关闭 Swagger,这需要怎么配置 #I2WOYV
    • [答疑] 兼容 Mvc 复杂验证没有试验成功 #I2X3GV
    • [答疑] Aop 能不能支持无接口的类 #I2X8AS
    • [答疑] 关于 JWT Token 自动刷新问题 #I2YD4K
    • [答疑] 能否增加一个拓展的 Entity,增加一些拓展的属性 #I2YDKT
    • [答疑] Furion 无法还原包,使用Nuget 下载和通过最新的的脚手架下载都提示这个问题 #I30446
    • [答疑] 复杂校验与特性验证不能并行 #I3046U
  • 不做实现

    • [废弃] 引入 Webhook 机制 #I2A3I0
    • [废弃] 增加 blog 存储服务 #I2AMBP
    • [废弃] Blazor Server 环境下 EF 的 DbContext 多线程问题 #I2AMD2
    • [废弃] 希望实现工作单元操作接口(IUnitOfWork)#I2AOR5
    • [废弃] 建议新增 string.ToPagedListAsync() 操作 #I2BZ3Z
    • [废弃] 建议新增 GraphQLOData 功能 #I2C9EH
    • [废弃] 迫切期望支持 CAP 分布式事务 #I2CBRF
    • [废弃] 如何让某个方法或实体变化后,不被 SavingChangesEvent 等拦截 #I2CEM9
    • [废弃] 建议日志封装增加更多拓展,比如:自定义保存日志文件 #I2CW8V
    • [废弃] 对 SqlSugar 的支持,增加 Nuget 脚手架 #I2D91U
    • [废弃] 使用 Middleware 实现反向代理 #I2DKM1
    • [废弃] 支持配置多个 Aop 功能 #I2E6Z2
    • [废弃] 是否计划开发类似网关的功能 #I2PD1L
    • [废弃] waring CS8002: 引用程序集 Furion 没有强名称 #I2WDN2
    • [废弃] Oracle 数据库驱动集成 Devart.Data.Oracle.Entity.EFCore #I2XJIU

v1.7.0(已发布)#

  • 新特性

    • [新增] Furion.Extras.ObjectMapper.Mapster 拓展包 #I29LSJ
    • [新增] Furion.Extras.Logging.Serilog 拓展包 #I2AAN8
    • [新增] Furion.Extras.Web.HttpContext 拓展包 #I29LSM
    • [新增] 内置 Token 刷新机制支持 #I29K57
    • [新增] 动态数据库上下文,支持运行时执行 OnModelCreating #I28UDT
    • [新增] 支持依赖注入排除指定接口 #I29693
    • [新增] 规范化结果返回时间戳字段 #I29697
    • [新增] 基础 CURD 父类操作例子 #I296SR
    • [新增] sql.Change("定位器完整类型名称") 支持 #I29LAB
    • [新增] UpdateIncludeUpdateExclude 忽略空参数支持 #I29VUG
    • [新增] 数据库上下文内置假删除查询过滤器支持 #I29Y2R
    • [新增] 忽略空值排除默认时间格式 #I29VUV
    • [升级] MiniProfiler 组件 #I297R9
  • 突破性变化

    • [调整] AppAuthorizeHandler 授权管道为异步处理 #I29MD9
    • [调整] Swagger 默认启用 JWT 授权支持 #I29LI4
    • [调整] HttpContextUtilities 名称改为 HttpContextLocal #I29KQE
    • [调整] UnifyResultContext 名称改为 UnifyContext #I29LLZ
    • [调整] 只有执行迁移命令才扫描种子数据 #I29E6P
    • [调整] 规范化结果 Successed 属性名为 Succeeded #I29NMV
    • [移除] Mapster 对象组件,采用提供拓展方式 #I29D2M
    • [移除] CacheManager 拓展类 #I29LU1
    • [重构] SaveChanges 拦截器 #I292LO
  • 问题修复

    • [修复] 未注册的数据库上下文也被引用全局查询拦截器 bug #I29ZXJ
    • [修复] 手动返回 BadObjectResultValidationProblemDetails 结果类型时规范化结果失效 bug #I29ZU9
    • [修复] 动态 WebApi KeepNameKeepVerbSplitCamelCase 无效 bug #I29X90
    • [修复] Sql代理 返回 元组 类型出错 bug #I29SMV
    • [修复] 401,403 状态码规范化返回值属性变大写 bug #I29M8Y
    • [修复] HttpContext 空异常 bug #I29LU4
    • [修复] 接口无返回值没有应用规范化结果 bug #I29GT7
    • [修复] 前端 Less 配置文件导致主机启动失败 bug #I29E7P
    • [修复] 执行 sql 结果转泛型后属性重复赋值 bug #I29BUO
    • [修复] Swagger 关闭 MiniProfiler 之后 组中组 失效 #I29789
    • [修复] 未启用规范化结果时异常返回 System.Object 字符 #I2969A
    • [修复] 正数数据验证 0 也验证通过 bug #I2955T
    • [修复] 非泛型类集成泛型接口依赖注入 bug #I294YT
    • [修复] Swagger 不支持 new 覆盖父类的 bug #I28Z1A
    • [修复] JsonSerializerUtility 没有公开 bug #I28WMI
    • [修复] SqlSugar 拓展查询泛型类型注册异常 bug #I28VMT
    • [修复] Furion Tools 不支持生成不同命名空间的实体 bug #I2A175
    • [修复] 全局拦截器无效 bug #I2A7T2
    • [修复] 新增或更新忽略空值空异常 bug #I2AB6C
  • 其他更改

    • [优化] Token 生成加密算法 #I29KIH
  • 文档变化

    • [新增] 日志文档 #I28Y9D
    • [调整] 数据库上下文、实体拦截器、配置、一分钟入门等等文档
  • 问答答疑

    • [问答] Swagger 如何实现授权访问 #I294F2
    • [问答] 如何实现多个数据库多对多实体配置 #I29G6S
    • [问答] 动态 WebApi 支持文件上传吗 #I29R5E
    • [疑问] 多个数据库上下文无法生成迁移代码 #I2A6II
  • 不做实现

    • [废弃] 实现 BuildChange 传入表名 #I292SN
    • [废弃] 执行数据库操作结果不支持属性忽略大小写赋值 #I29DRQ
    • [废弃] 引入 Webhook 机制 #I2A3I0

v1.4.0(已发布)#

  • 新特性

    • [新增] Furion 支持二级虚拟目录部署功能 #I28B77
    • [新增] Furion.Template.RazorWithWebApi 脚手架 #I28QGI
    • [新增] Furion.Template.BlazorWithWebApi 脚手架 #I27Z3O
    • [新增] EFCore 时态查询拓展 #I28AJ
    • [新增] [AppDbContext(连接字符串,数据库类型)] 配置支持 #I28QTB
    • [新增] DateTimeOffsetDateTime 拓展方法 #I27MQA
    • [新增] ValidationTypes 验证正则表达式智能提示 #I2801V
    • [新增] ValiationTypes.WordWithNumber 验证 #I2805
    • [新增] 获取客户端和服务端 IP 地址 #I28QV9
  • 突破性变化

    • [升级] .NET 5.0 版本至 .NET 5.0.1 版本 #I28QU
    • [重构] 视图引擎功能,优化不规范命名和新增字符串模板编译 #I28G0S
    • [重构] 数据库实体查找算法,并优化性能 #I28QUQ
    • [优化] 应用启动初始化性能和数据库第一次自动配置 DbSet 性能
  • 问题修复

    • [修复] 多数据库上下文配置定位器后实体无法正确生成 bug #I2888L
    • [修复] 多租户数据库上下文实体生成 bug #I2891G
    • [修复] 对象验证失败提示消息没有应用 JSON 大小写配置 bug #I27UTX
    • [修复] 仓储 InsertUpdate 方法指定 ignoreNullValues 无效 bug #I27UN6
    • [修复] Controller 派生类如果贴了 [Route] 特性后出现在 Swagger 中 bug #I27TN7
    • [修复] SqlScalar 执行 sql 返回 Nullable 类型出现转换失败 bug #I27S2N
    • [修复] [UnitOfWork] 特性异常 bug #I27MLM
    • [修复] sql 静态执行方式和 sql 高级代理无法监听数据库连接状态 bug #I27M4F
    • [修复] 修复更换 Json 序列化库无效 bug,如替换为 Microsoft.AspNetCore.Mvc.NewtonsoftJson #I27M43
    • [修复] Furion Tools 工具生成模型 bug #I27XI5
    • [修复] 软删除没有生效 bug #I2804I
    • [修复] Furion Tools 识别带多个 \\ 的连接字符串识别 bug #I280TS#PR91
    • [修复] Furion Tools 无法取消生成 bug #I2816M
    • [修复] DateTimeOffset 转本地时间差 8 小时 bug #I28BA9
    • [修复] 启用 bundle js&css 压缩后启动异常 bug #I28KR
    • [修复] ValidationTypes.Required 无效 bug #PR98
    • [修复] 规范化结果OnValidateFailed 参数名拼写错误 bug #PR93#PR92
    • [修复] 授权管道验证失败还显示结果 bug #PR89
  • 其他更改

    • [更新] README.md 友情连接地址 #PR88
    • [更新] 模板脚手架源码,添加 EFCore Tools#PR87
    • [更新] README.md Nuget 图标 #PR85
    • [废弃] 将 List<T>DateTable #PR97
  • 文档变化

    • [新增] 视图引擎模板文档 #I27ZVA
    • [新增] EFCore 时态查询文档 #I28AJ, DOC
    • [更新] 仓储文档书写纰漏 bug #PR90
    • [更新] 选项文档错误 bug #PR86
    • [更新] 实体数据监听器 文档书写错误 bug #PR83
    • [更新] 数据库上下文、多数据库、脚手架等文档
  • 问答答疑

    • [建议] 希望 api 返回的值自动将 null 转为 '' 或 [][#I286IJ](https://gitee.com/dotnetchina/Furion/issues/I286IJ),【已关闭】
    • [建议] 添加网关功能 #I27TP7,【已关闭】
    • [建议] 新增 SqlQuery<T> 获取单条记录方法 #I28M1V,【已关闭】
    • [建议] 希望可以提供集成 Serilog 例子 #I282J4,【已关闭】
    • [疑问] 如何通过特性配置唯一约束 #I2891L,【已关闭】
    • [疑问] 怎么读取 appsettings.json 数组 #I27WU,【已关闭】
    • [疑问] IRepository<TEntity> 出现空异常 #I281IE,【已关闭】
    • [疑问] 规范化接口问题问题 #I28NMZ,【已关闭】
    • [疑问] 统一返回值模型中 OnResponseStatusCodes 未执行 #I28NNL,【已关闭】

v1.2.0(已发布)#

  • 新特性

    • [新增] 雪花算法 #I26OXG, #PR78
    • [新增] [AppDbContext] 配置数据库提供器支持 #I27G3T
    • [新增] 实体表数据更改监听接口 IEntityDataChangedListener #I278DD, #I278LQ
    • [新增] 全局服务接口 AOP 拦截功能 #I278CP
    • [新增] 定位器仓储 IDbRepository<TDbContextLocator> #I276Q3
    • [新增] 数据库操作 InsertOrUpdate 支持排除空字符串功能 #I272OG
    • [新增] 数据库操作 UpdateIncludeUpdateExclude 匿名对象支持 #I271X0
    • [新增] 数据验证传入空对象跳过验证支持 #I273R4
    • [新增] 应用启动时支持排除特定配置文件自动加载 #I26U0A
    • [新增] 单个实体表名前缀支持 #I26LX0
    • [新增] MySql 数据库自动配置默认版本号 #I26XQ6
    • [优化] 授权处理程序代码
  • 突破性变化

    • [新增] 实体表数据更改监听接口 IEntityDataChangedListener #I278DD, #I278LQ
    • [新增] 全局服务接口 AOP 拦截功能 #I278CP
    • [新增] 雪花算法 #I26OXG, #PR78
  • 问题修复

    • [修复] 视图引擎加载外部程序集出错 bug
    • [修复] 依赖注入代理接口报空对象异常 bug
    • [修复] EFCore 取消附加实体出错 bug
    • [修复] 数据库仓储在非 Web 请求下出现空异常 bug
    • [修复] 多个授权策略共存问题出现无效 bug
    • [修复] 友好异常 Oop.Oh 不支持普通方法 bug
    • [修复] 获取多租户对象时数据库上下文出现作用域验证失败 bug
    • [修复] 工作单元不支持 Sql代理 拦截 bug #I27GST
  • 其他更改

  • 文档变化


v1.1.0(已发布)#

  • 新特性

    • [新增] Db.GetDbContext() 获取默认数据库上下文方法
    • [新增] HttpContextUtility.GetCurrentHttpContext() 获取全局 HttpContext 上下文
    • [新增] App.GetRequiredService<> 解析服务方法
    • [新增] object.GetService<> 对象拓展方法
    • [新增] 策略授权 PolicyPipeline 基类方法,支持多重判断授权
    • [新增] JWTEncryption.ValidateJwtBearerToken 手动验证静态方法
    • [新增] 全局数据库上下文 InsertOrUpdateIgnoreNullValuesEnabledEntityStateTracked 全局配置
    • [新增] Swagger Jwt授权 全局授权参数 #I26GLR
    • [新增] InsertOrUpdate 支持自定义判断条件功能 #I269Q1
    • [新增] 字符串字段小写命名支持 #I2695D
    • [新增] 字符串文本对比功能 #I268LE
    • [新增] 全局异常特性消息功能 #I2662O
    • [新增] InsertUpdate 数据库忽略空值功能 #I264Q4
  • 突破性变化

    • [调整] Fur 项目名为 Furion
    • [调整] Db.GetRequestDbContext<>() 命名为 Db.GetDbContext<>()
    • [调整] Db.GetDbContext<>() 命名为 Db.GetDuplicateDbContext<>()
    • [重构] App.GetService<> 解析服务的底层逻辑,大大提高了解析服务的性能
    • [重构] 授权核心代码,保持和微软一致的授权规范 #I26DCB
    • [移除] App.GetRequestService<> 方法
    • [移除] ValidateJwtBearer Jwt 授权方法,无需手动判断了
  • 问题修复

    • [修复] Furion 官方脚手架生成后编译异常 bug
    • [修复] Tenant 内置属性不是 virtual 修饰 bug
    • [修复] dockerfile 新命名构建失败 bug
    • [修复] 自定义角色授权和多个授权共存出现 403 bug #I26H1L
    • [修复] httpContext.GetEndpoint() 空异常 bug #PR73
    • [修复] Oops.Oh 空异常和不支持服务服务抛异常 bug #I26EFU#I26GM4
    • [修复] cli.ps 生成文件编码乱码 bug #I26DVT
    • [修复] Swagger 文件上传按钮不显示 #I26B6U
    • [修复] 规范化结果授权状态码序列化大小写不一致问题 #I26B26
    • [修复] 未启用规范化结果时中文乱码 bug #I268T5
    • [修复] MySql 异步异常捕获不到 bug #I265SO
    • [修复] cli.ps1 提示找不到数据库连接字符串 bug #I2647U
  • 其他更改

  • 文档变化

    • [更新] 一分钟入门、安全鉴权、数据库等文档

v1.0.3(已发布)#

  • 新特性

    • [新增] Mvc 模板脚手架:Fur.Template.Mvc
    • [新增] WebApi 模板:Fur.Template.Api
    • [新增] Mvc/WebApi 模板:Fur.Template.App
    • [新增] Razar Pages 模板:Fur.Template.Razor
    • [新增] Blazor 模板:Fur.Template.Blazor
  • 突破性变化

    • [调整] PagedListSystem.Collections.Generic 命名空间下
    • [优化] 解析服务性能问题,底层代码大量优化
  • 问题修复

    • [修复] ApiSears.ControllerEnd不起作用 bug #I25KH6
    • [修复] RemoteRequest 请求完成结果序列化属性大小写问题 #I25I8R
    • [修复] HttpContext.GetEndpoinet() 空异常 bug #PR73
  • 其他更改

  • 文档变化

    • [更新] 入门文档、数据库上下文文档、多数据库操作文档

v1.0.2(已发布)#

  • 新特性

    • [新增] Pomelo.EntityFrameworkCore.MySql 最新 .NET 5 包配置 #I24ZQK
    • [新增] .AddDateTimeJsonConverter(format) 时间格式序列化配置
    • [新增] DateTimeDateTimeOffset 类型序列化格式配置 #I253FI
  • 突破性变化

    • [更新] Mapster 包至 7.0.0
    • [调整] App.Services 名为 App.ServiceProvider
    • [移除] App.ApplicationServicesApp.GetRequestService<>()
    • [移除] 非 Web 主机注入拓展
  • 问题修复

    • [修复] services.AddFriendlyException() 缺少配置注入 bug
    • [修复] 数据库上下文池被释放和高并发下内存溢出 bug #I2524K#I24UMN
    • [修复] Sql代理 返回空数据时异常 bug #I24TCK
    • [修复] 工作单元 [UnitOfWork] 多数据库被释放 bug #I24Q6W
  • 其他更改

    • [调整] EntityBaseEntity 所有属性为 vitural 修饰
    • [优化] Jwt 读取和解析性能
    • [优化] 优化代码支持 C# 9.0 最新语法
    • [优化] MD5 加密性能 #PR71
    • [移除] 无用或未使用代码
  • 文档

    • [更新] 数据库上下文、多数据库、一分钟入门文档

v1.0.0(已发布)#

  • 新特性

    • [新增] 网络请求 RemoteRequest 组件 #I1YYWD
    • [新增] .AddInjectBase() 注入,只包含基础服务注入
    • [新增] 所有服务都支持 IServiceCollectionIMvcBuilder 注入
    • [新增] 抛异常状态码设置功能 StatusCode
    • [新增] Swagger 序列化支持 Pascal 属性命名方式
  • 突破性变化

    • [更新] 所有的包为 .NET 5 正式版
  • 问题修复

    • [修复] SqlProxy 代理异步处理 bug
    • [修复] 数据库类型 DatetimeDateTimeOffset bug
    • [修复] 属性首字母大小写序列化不匹配出现 null bug
    • [修复] 对象序列化中文出现乱码 bug
    • [修复] 默认序列化配置无效 bug
    • [修复] 数据库非依赖注入方式提交无效 bug
    • [修复] 应用程序池提交所有 DbContext 空异常 bug
    • [修复] Saas 多租户 Tenant 类型字符串属性在 MySql 数据库下出现 longtext 类型 bug
    • [修复] Mvc 自动验证字符串空值 bug #I24M2T
    • [修复] 枚举注释被覆盖 bug #I24N6J
    • [修复] 忽略规范化结果无效 bug #I24B8P
    • [修复] Swagger 默认 ContentType 不是 applicaiton/json bug #I24F3U
    • [修复] 内置 System.Text.JsonNewtonsoft.Json 冲突 bug #I24F3U
  • 其他更改

    • [调整] Fur 框架域名为:https://furion.pro
    • [调整] 仓储 FromSqlRawFromSqlInterpolated 接口位置
    • [优化] 数据加解密性能,#PR70
  • 文档

    • [更新] README.md、框架介绍、数据库上下文、配置选项、多租户、跨域文档
Last updated on by Monk
+
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

1.6 更新日志

此章节只记录重大版本更新日志,小迭代版本不做更新。想了解更多更新内容,可查阅 CHANGELOG.md

v1.17.0 (当前版本)#

  • 新特性

    • [新增] 动态 WebAPI 支持继承基类配置特性 #I3D5PX
    • [新增] 远程请求支持 multipart/form-data 内容类型处理 #I3D7KG
    • [新增] 字符串加密拓展 #I3DHBW
    • [新增] 新增远程请求可直接下载返回值内容转为 string 类型 #I3DIGR
    • [新增] 远程请求地址支持模板引擎 #I3D5Y8
    • [新增] [DataValidation] 错误消息支持 string.Format 操作 #I3E08W
    • [新增] 远程请求 HttpRequestMessage 拓展方法 AppendQueries() 追加更多 query 参数拓展 #I3E3DI
  • 突破性变化

    • [调整] IRepository.AsAsyncEnumerable() 返回值 #I3DIQ1,调整为:rep.AsQueryable().ToListAsync()
  • 问题修复

    • [修复] 数据验证失败后也打印了成功的字段 #I3CVBS
    • [修复] 远程请求配置 contentTypeapplication/x-www-form-urlencoded 无效问题#I3CWBS
    • [修复] 远程请求无法打印完整的请求地址,比如配置了 HttpClient 之后 #I3CY42
    • [修复] 程序启动时排除默认配置文件算法不对,应该采用正则表达式匹配 #I3D9E7
    • [修复] 远程请求成功请求拦截不生效 #I3DOE4
    • [修复] Dapper 拓展数据库切换为 oracle 时,系统找不到指定的文件 Oracle.ManagedDataAccess.Core #I3DYM3
  • 其他更改

    • [改进] 获取 JWT token 信息支持配置 Token 前缀,如 Bearer #I3DJIV
    • [改进] 刷新 Token 黑名单存储方式,将内存缓存调整为分布式缓存 #I3DPBR
  • 文档变化

    • [调整] 远程请求文档 #I3CPJO
  • 问答答疑

    • [答疑] LinqExpression.And 没有 2 个参数的方法 #I3CXKZ
    • [答疑] 异常信息 如何记录到数据库中:) #I3DDGO
    • [答疑] 无键实体选用 IEntityNotKey #I3DWRF
    • [答疑] 根据主键删除一条记录不成功,无错误信息 #I3DWWF
    • [答疑] 如何自定义接口返回格式 #I3DZN6
    • [答疑] DynamicApiController 如何在运行时决定是否公开一个 Action #I3D5UL
    • [答疑] Furion.DatabaseAccessor.DbHelpers 方法:ConvertToDbParameters 是不是应该过滤掉贴 NotMapped 的特性 #I3E2XS
  • 不做实现

    • [废弃] 框架是否提供 ISoftDelete 类似接口 #I3CP93

v1.16.0 (已发布)#

  • 新特性

    • [新增] IDGenerator 雪花 ID 算法,感谢 idgenerator 作者提交 PR #PR204 #I3B60S
    • [新增] DbContext 刷新多租户缓存拓展方法 #I39N5U
    • [新增] 自定义配置单个控制器名称规范,如小写路由 #I3A5XL
    • [新增] 获取当前选择区域语言方法 #I3BSDH
  • 突破性变化

    • [升级] .NET 5 SDK 至 5.0.4 版本 #I3ASTL
    • [重构] 远程请求所有功能 #I2LB7M
    • [重构] JSON 序列化功能,提供统一的抽象接口,方便自由替换 JSON#I39GT9
    • [重构] 验证失败返回消息模型及规范化接口验证参数 #I3AFQW
    • [优化] 插件式开发热插拔功能,实现动态加载卸载 #PR200, 感谢 @SamWangCoder
    • [移除] 移除 JsonSerializerUtility 静态类及移除属性大写序列化拓展配置 #I3AFRJ
  • 问题修复

    • [修复] MVC 模式下不支持验证自定义验证逻辑 #I39LM5
    • [修复] 验证数值类型正则表达式不支持负数 bug #I39YUV
    • [修复] 框架启动时无法加载未被引用的程序集 bug #I3A3Z4
    • [修复] EFCoreRepository.IsAttached() 方法判断错误 bug #I3A824
    • [修复] 动态API 驼峰显示配置无效 bug #I3AF32
    • [修复] cli.ps1 不支持新版本 EFCore bug #I3APO9
    • [修复] EFCore 实体配置 [Table] 特性无效 bug #I3BAYH
    • [修复] 动态 WebAPI CheckIsSplitCamelCase bug #I3BLKX
    • [修复] 修复动态 WebAPI 配置保留 Action 的 Async 后缀无效问题 #I3C3DA
    • [修复] JWT Token 刷新后旧的刷新 Token 依旧可用 bug #I3C8ZH
    • [修复] 多语言 Razor 视图变量多语言乱码问题 #I3CBMU
  • 其他更改

    • [优化] 默认序列化提供器 System.Text.Json 反序列化字符串时区分大小写问题 #I3BSXV
    • [优化] 优化 MessageCenter 性能问题 #I39PRR
    • [优化] 数据库上下文池小性能优化
  • 文档变化

    • [新增] Docker 环境下自动化部署 #PR209
    • [新增] JSON 序列化 文档 #I3B6D8
    • [更新] 跨域、安全授权、即时通信文档、多语言、规范化文档
  • 问答答疑

    • [答疑] Furion.Extras.DatabaseAccessor.SqlSugar 配置多个数据库打印 SQL 语句问题 #I39PDC
    • [答疑] ORACLE 数据库多租户模式下返回值为指定类型时系统卡死 #I39RNH
    • [答疑] 假删除指向异常 #I39XZA
    • [答疑] Furion 多语言配置节是放在 AppSettings 里面还是外面呢? #I3A4SB
    • [答疑] 没找到数据库上下文 #I3A5HS
    • [答疑] 有 QQ 交流群吗? #I3AAM7
    • [答疑] Vue3 环境下配置 SignalR 跨域出错 #I3ALQ7
    • [答疑] 设置 Swagger 参数非必填 #I3AT02
    • [答疑] EFCore 调用 Insert 时报 Unknown column 'Discriminator' in 'field list' 异常 #I3B2LC
    • [答疑] 逆向 mysql 数据库时 cli 出现错误 #I3B64F
    • [答疑] Sql 高级代理使用过程中 DateTime 类型的参数序列化失败 #I3AZXK
    • [答疑] 使用 Mysql 执行 Add-Migration 报错 #I3B8EW
    • [答疑] Saas 多租户模式-独立 Database 模式下无法获取 Tenant, 导致无法自动切换的问题#I3AVXU
    • [答疑] 如何自定义 WebAPI 统一结果模型 #I3BBYW #I3BBYV
    • [答疑] 在 Web.Entry 项目新建了一个 Controller,多了未知方法 #I3BKH5
    • [答疑] AOP 拦截如何解析服务 #I3BUM3
    • [答疑] 动态 WebAPI 返回参数被省略 #I3C2XR
    • [答疑] 如何设置某一个接口响应数据不自动转小写,按原始字段名返回 #I38L9B
    • [答疑] code first 如何配置自动迁移 #I3CCR0
    • [答疑] webapi 混合授权如何区分不同系统 #I3CJCY
    • [答疑] EFCore 不支持递归无限级遍历关系 #I3CET9
  • 不做实现

    • [废弃] 建议 EFCore 可配置外键关系导航问题 #I3994X
    • [废弃] 建议将 EFCore 剥离出来,作为插件的形式提供。这样可以选择自己喜欢的 ORM #I3ABNX
    • [废弃] 事件总线能否提供返回值 #I3AWL6
    • [废弃] Sql 模板能仿照 Mybatis 一样加各种标签吗?#I3ASRS
    • [废弃] EFCore 更新或排除更新指定列支持传入 DTO 模型 #I3AS5K
    • [废弃] 新增 UnitOfWork 事务完成事件 #I3BRMI

v1.15.0 (已发布)#

  • 新特性

    • [新增] 跳过特定实体数据库操作监听特性 #I386LB
    • [新增] IEntityChangedListener 增加对 OldEntity 的支持 #I385X2
    • [新增] 实时通信自动配置集线器拓展及特性 #I387QX
    • [新增] Mapster 拓展支持 IMapper 依赖注入方式 #I38C7C
    • [新增] [AppDbContext] 特性默认构造函数 #I38J97
    • [新增] UnifyContext.GetExceptionMetadata(context) 返回错误码支持 #I38ONX
  • 突破性变化

  • 问题修复

    • [修复] 多次循环中调用 Db.GetNewDbContext() 还是获取到同一个对象 #I38NNP
    • [修复] Swagger 过滤掉 object 类型属性问题 #I38FHL
    • [修复] 同一类不支持多继承 IEntityChangedListener 问题 #I38UQJ
    • [修复] 自定义序列化属性名称导致验证失败属性不匹配问题 #I38W8Z
  • 其他更改

    • [优化] 代码不规范命名导致开发者阅读代码时产生歧义
  • 文档变化

    • [新增] FluentValidation 集成文档 #I38IOT
  • 问答答疑

    • [答疑] Furion 框架版本向下兼容问题 #I38WMZ
  • 不做实现

    • [废弃] 建议 SqlSugar 添加动态切换数据库功能 #I38G4M
    • [废弃] 建议 MessageCenter 采用 Channel 实现 #I38BP8
    • [废弃] 建议接口文档整合 Knife4jUI 或 Redoc #I38S70

v1.14.0(已发布)#

  • 新特性

    • [新增] EFCore 5.0 的 Oracle 数据库支持 #I37Z8E
    • [新增] 控制是否在开发环境下显示数据库连接信息 #I37YQ2
    • [新增] [NonUnify] 支持在类中贴此特性 #I359Q6
    • [新增] 网络请求 字符串 HttpClient 拦截器 #I35F3E
    • [新增] HttpContextHttpRequest 获取远程地址拓展 #I3688Z
    • [新增] services.AddMvcFilter<> 添加 Mvc 过滤器拓展 #I368BH
  • 突破性变化

    • [升级] 框架依赖的 .NET 5 SDK 至最新版 5.0.3 #I37YQQ
    • [升级] Swashbuckle.AspNetCore 组件包到 6.0.x 版本 #I37EZK
    • [移除] Furion 框架 JWT 拓展类,只在 Furion.Extras.Authentication.JwtBearer 中保留 #I35D59
  • 问题修复

    • [修复] 传入错误 JWT Token 字符串导致自动刷新 Token 出现字符串边界值异常 bug #I34ZE5
    • [修复] 瞬时作用域数据库上下文也会自动加入工作单元导致写日志时连锁异常 bug #I37WTV
  • 其他更改

    • [优化] 获取系统环境参数的性能 #I36SR5
    • [优化] Furion 底层添加 Mvc 过滤器代码 #I36SKA
    • [优化] 添加默认 Json 序列化时间默认时间格式 #I36SL0
    • [升级] 升级 SqlSugar 拓展包到 5.0.2.6 版本 #I36SIG
  • 文档变化

    • [新增] 数据库入门文档 #I37Z8S
    • [新增] 更新日志文档 #I36PI0
    • [新增] 请求审计日志、执行 Sql 更新日志文档 #I36PIK
    • [新增] 前端使用 axios 跨域配置文档 #I36PIT
    • [新增] App 静态类获取应用、环境更多信息数据 #I36SOV
    • [新增] 英文版 README.md 介绍 #I37QHP
  • 问答答疑

  • 不做实现

    • [废弃] 多语言资源文件自动创建 #I35AA4
    • [废弃] 建议多语言加上维吾尔语支持 #I37X1L

v1.13.0(已发布)#

  • 新特性

    • [新增] 多语言功能及拓展 #I2DOCL
    • [新增] 事件总线功能及消息中心 #I23BKN
    • [新增] Swagger 分组显示隐藏配置 #I2AHH8
    • [新增] Furion.Extras.Logging.Serilog 拓展插件 #I2AAN8
    • [新增] cli.ps 支持 -Namespace 命名空间指定 #I2A175
    • [新增] Swagger 规范化化文档授权失效后自动取消授权锁 #I2AIWC
    • [新增] Request.Body 支持重复读功能,主要解决微信 SDK 问题 #I2AMG0
    • [新增] 网络请求功能及文档 #I2APGJ
    • [新增] SqlSugar 拓展包支持打印 sqlMiniProfiler#I2ASLS
    • [新增] Furion.Extras.DatabaseAccesssor.Dapper 拓展插件 #I2ASYA
    • [新增] Furion.Extras.DatabaseAccessor.PetaPoco 拓展插件 #I2AUGA
    • [新增] 网络请求字符串拓展方法 #I2CPQ0
    • [新增] SqlSugar 拓展新增 PagedList 拓展 #I2CW99
    • [新增] 远程请求支持参数特性验证 #I2CX5L
    • [新增] App.User 获取当前授权用户信息便捷方法 #I2CZLO
    • [新增] 规范化文档可配置功能,支持 appsettings.json 配置 #I2D1K9
    • [新增] 远程请求拦截器添加方法和方法参数 #I2D2CM
    • [新增] 远程请求出错返回默认值支持 #I2D44M
    • [新增] 远程请求 body 参数序列化支持设置 PropertyNamingPolicy #I2D685
    • [新增] 远程服务接口客户端配置 #I2D7PS
    • [新增] AddInjectUseInject 允许自定义 SecurityDefinitionsSwaggerUI #I2DIMG
    • [新增] [SecurityDefine] 默认构造函数 #I2DNXT
    • [新增] AspectDispatchProxy 动态代理类 #I2DO6I
    • [新增] [QueryParameters] 特性,支持一键将 Action 参数添加 [FromQuery] 特性 #I2G8TF
    • [新增] 动态日志配置及拓展方法 #I2GDGD
    • [新增] WebApi 请求谓词默认规则配置功能 #I2M70X
  • 突破性变化

    • [升级] .NET 5 SDK 到 .NET 5.0.2 版本 #I2D0PZ
    • [调整] 框架内所有拓展类命名空间,全部迁移到 Furion.模块.Extensions#I2AH54
    • [调整] Swagger 记住授权存储方式,替换 Session 存储方式为 LocalStorage 方式 #I2AKUA
    • [调整] Furion 框架包描述文件,减少框架体积 #I2APAU
    • [调整] App.CanBeScanTypesApp.EffectiveTypes #I2B0ZR
    • [调整] App.ServiceProvider 属性并移除 App.GetDuplicateXXX 方法 #I2CYZE
    • [调整] Db.GetDuplicateDbContextDb.GetNewDbContext #I2CZ04
    • [调整] Db.GetSqlDispatchProxyDb.GetSqlProxy #I2DO9T
    • [重构] Aop 服务拦截器,支持异步、同步两种方式 #I2B9HQ
    • [重构] 网络请求所有功能 #I2BMR7
  • 问题修复

    • [修复] Swagger 规范化化结果不一致 bug #I2ACF3
    • [修复] 数据库新增或更新忽略空值操作方法报空异常 #I2AB6C
    • [修复] Startup.cs Aop 全局拦截无效 #I2A7T2
    • [修复] Token 过期后自动刷新 Token 无法获取最新的用户信息 bug #I2AWQI
    • [修复] [ApiDescriptionSettings(Tag="xx")] 导致 swagger.json 报错 bug #I2B47R
    • [修复] Mysql sql 数据库查询结果 tinyint 类型转换出错 bug #I2BEBM
    • [修复] 规范化结果多次包裹类型 bug #I2BHHZ
    • [修复] 动态 Api 基元类型数组问题 #I2BMS5
    • [修复] sql 查询枚举类型转换异常 bug #I2BS2Y
    • [修复] string.SqlQuerizeAsync<T1>() 拓展返回错误 bug #I2BSTS
    • [修复] 动态 Api 子类重写父类方法并取别名后 Swagger 异常 bug #I2C9VP
    • [修复] 网络请求 application/json 序列化大小写问题 #I2CRJC
    • [修复] 多数据库定位器实体嵌套关联 bug #I2CVN0
    • [修复] 跨域响应头设置无效 bug #I2CW5T
    • [修复] 远程网络请求代理打印到 MiniProfiler bug #I2CZBC
    • [修复] 远程请求响应拦截器 bug #I2D4DG
    • [修复] SqlSugar 框架 AsQueryable() 一直追加参数 #I2DH1D
    • [修复] 自动刷新 Token 空异常 bug #I2DO29
    • [修复] 生成 JWT Token 不传过期时间出现验证 401 bug #I2DO8L
    • [修复] AppStartup 排序无效 #I2DVD2
    • [修复] 未启用多语言服务时友好异常和验证出现空异常 #I2ECUJ
    • [修复] 数据校验字母和数字组合无法匹配 bug #I2EF2Q
    • [修复] 数据校验手机或固话无效 bug #I2M5IZ
    • [修复] Dapper 拓展解析 SqlConnection 异常 bug #I2M5P2
    • [修复] 开启多语言后,EF 迁移异常 bug #I2M7DT
    • [修复] IEntityTypeBuilder 不支持多重继承 bug #I2PAOD
    • [修复] JwtHandler 设置自动刷新后,匿名访问无法通过 bug #I2SDOX
    • [修复] Dapper 拓展中 SqlServer 数据库获取连接对象类型 bug #PR159
  • 其他更改

    • [优化] 移除 Sql 查询结果映射检查 [NotMapper] 特性机制 #I34XD0
    • [优化] 依赖注入时排除 IDynamicApiController 接口 #I2ECTG
    • [优化] MD5 加密性能 #PR158
  • 文档变化

    • [重构] 文档首页 #I34XBR
    • [新增] 网络请求文档 #I2APGJ
    • [新增] 多语言文档 #I2DOCL
    • [新增] 文档全文搜索引擎 #I34XAW
    • [新增] 全局静态类类型 #I34XB4
    • [新增] 框架可配置选项文档 #I34XB9
    • [新增] 事件总线文档 #I34XBI
    • [新增] 数据加解密文档 #I34XC0
    • [新增] 贡献指南文档 #I34XC8
    • [新增] HttpContext文件上传下载 博客文章 #I34XCB
    • [其他] 文档小调整,小优化
  • 问答答疑

    • [答疑] 跨域设置无效 #I2ASNJ
    • [答疑] MVC 视图无效,原因是 .cshtml 文件没有设置为 内容 #I2AXUU
    • [答疑] Sql 操作可以实现事务吗?#I2B0NX
    • [答疑] IRepository 操作数据库会打开多次数据库连接 #I2BB7B
    • [答疑] 如何进入自定义 AppAuthorizeHandler 断点 #I2BGXY
    • [答疑] SqlSugar 注入问题 #I2C2AQ
    • [答疑] 建议增加 API 签名验证,时效验证 #I2C6ET
    • [答疑] 多数据库多租户同时使用 Add-Migration 报错 #I2CEHS
    • [答疑] ISqlSugarRepository 没有 Getxxx 方法 #I2CJLZ
    • [答疑] cli.ps1 如何将 sql 里的表导出成 model#I2CSUL
    • [答疑] 手动修改 Swagger 终结点路径无效 #I2D608
    • [答疑] DefaultDbContext 不能识别 #I2DCZX
    • [答疑] 各分层项目 Startup.cs 支持 Configuration #I2DDUP
    • [答疑] Aop 无法拦截,无效 #I2DEY8
    • [答疑] mysql 执行 Add-Migration 报错 #I2DSB8\
    • [答疑] Entity 创建时间和是否删除添加默认值 #I2E04H
    • [答疑] swagger 中多个 servers 设置 #I2E0IF
    • [答疑] 全局筛选器 没有执行 #I2E5R4
    • [答疑] 多数据库定位器疑问 #I2E77T
    • [答疑] cli.ps 逆向工程 Mysql 数据库报错 #I2E7I5
    • [答疑] Swagger 开发环境 applicationsettings.json 中文乱码 #I2EAG1
    • [答疑] 增加指定路径程序集映射 #I2EEO2
    • [答疑] 动态编译 cs 脚本文件 #I2EH66
    • [答疑] 自定义中间件,返回的错误没有规范化结果 #I2NV8S
    • [答疑] Swagger 循环引用设置生成文档层级无效 #I2PLQQ
    • [答疑] 配置文件支持 yaml 文件吗? #I2TJ3N
    • [答疑] 修改数据库未 mysql 执行 Add-Migration 报错 #I2VR64
    • [答疑] 多数据库使用定位器时报错 #I2VR8F
    • [答疑] Migration To Oracle 异常 #I2WBYQ
    • [答疑] 开发时显示 Swagger,上线时关闭 Swagger,这需要怎么配置 #I2WOYV
    • [答疑] 兼容 Mvc 复杂验证没有试验成功 #I2X3GV
    • [答疑] Aop 能不能支持无接口的类 #I2X8AS
    • [答疑] 关于 JWT Token 自动刷新问题 #I2YD4K
    • [答疑] 能否增加一个拓展的 Entity,增加一些拓展的属性 #I2YDKT
    • [答疑] Furion 无法还原包,使用Nuget 下载和通过最新的的脚手架下载都提示这个问题 #I30446
    • [答疑] 复杂校验与特性验证不能并行 #I3046U
  • 不做实现

    • [废弃] 引入 Webhook 机制 #I2A3I0
    • [废弃] 增加 blog 存储服务 #I2AMBP
    • [废弃] Blazor Server 环境下 EF 的 DbContext 多线程问题 #I2AMD2
    • [废弃] 希望实现工作单元操作接口(IUnitOfWork)#I2AOR5
    • [废弃] 建议新增 string.ToPagedListAsync() 操作 #I2BZ3Z
    • [废弃] 建议新增 GraphQLOData 功能 #I2C9EH
    • [废弃] 迫切期望支持 CAP 分布式事务 #I2CBRF
    • [废弃] 如何让某个方法或实体变化后,不被 SavingChangesEvent 等拦截 #I2CEM9
    • [废弃] 建议日志封装增加更多拓展,比如:自定义保存日志文件 #I2CW8V
    • [废弃] 对 SqlSugar 的支持,增加 Nuget 脚手架 #I2D91U
    • [废弃] 使用 Middleware 实现反向代理 #I2DKM1
    • [废弃] 支持配置多个 Aop 功能 #I2E6Z2
    • [废弃] 是否计划开发类似网关的功能 #I2PD1L
    • [废弃] waring CS8002: 引用程序集 Furion 没有强名称 #I2WDN2
    • [废弃] Oracle 数据库驱动集成 Devart.Data.Oracle.Entity.EFCore #I2XJIU

v1.7.0(已发布)#

  • 新特性

    • [新增] Furion.Extras.ObjectMapper.Mapster 拓展包 #I29LSJ
    • [新增] Furion.Extras.Logging.Serilog 拓展包 #I2AAN8
    • [新增] Furion.Extras.Web.HttpContext 拓展包 #I29LSM
    • [新增] 内置 Token 刷新机制支持 #I29K57
    • [新增] 动态数据库上下文,支持运行时执行 OnModelCreating #I28UDT
    • [新增] 支持依赖注入排除指定接口 #I29693
    • [新增] 规范化结果返回时间戳字段 #I29697
    • [新增] 基础 CURD 父类操作例子 #I296SR
    • [新增] sql.Change("定位器完整类型名称") 支持 #I29LAB
    • [新增] UpdateIncludeUpdateExclude 忽略空参数支持 #I29VUG
    • [新增] 数据库上下文内置假删除查询过滤器支持 #I29Y2R
    • [新增] 忽略空值排除默认时间格式 #I29VUV
    • [升级] MiniProfiler 组件 #I297R9
  • 突破性变化

    • [调整] AppAuthorizeHandler 授权管道为异步处理 #I29MD9
    • [调整] Swagger 默认启用 JWT 授权支持 #I29LI4
    • [调整] HttpContextUtilities 名称改为 HttpContextLocal #I29KQE
    • [调整] UnifyResultContext 名称改为 UnifyContext #I29LLZ
    • [调整] 只有执行迁移命令才扫描种子数据 #I29E6P
    • [调整] 规范化结果 Successed 属性名为 Succeeded #I29NMV
    • [移除] Mapster 对象组件,采用提供拓展方式 #I29D2M
    • [移除] CacheManager 拓展类 #I29LU1
    • [重构] SaveChanges 拦截器 #I292LO
  • 问题修复

    • [修复] 未注册的数据库上下文也被引用全局查询拦截器 bug #I29ZXJ
    • [修复] 手动返回 BadObjectResultValidationProblemDetails 结果类型时规范化结果失效 bug #I29ZU9
    • [修复] 动态 WebApi KeepNameKeepVerbSplitCamelCase 无效 bug #I29X90
    • [修复] Sql代理 返回 元组 类型出错 bug #I29SMV
    • [修复] 401,403 状态码规范化返回值属性变大写 bug #I29M8Y
    • [修复] HttpContext 空异常 bug #I29LU4
    • [修复] 接口无返回值没有应用规范化结果 bug #I29GT7
    • [修复] 前端 Less 配置文件导致主机启动失败 bug #I29E7P
    • [修复] 执行 sql 结果转泛型后属性重复赋值 bug #I29BUO
    • [修复] Swagger 关闭 MiniProfiler 之后 组中组 失效 #I29789
    • [修复] 未启用规范化结果时异常返回 System.Object 字符 #I2969A
    • [修复] 正数数据验证 0 也验证通过 bug #I2955T
    • [修复] 非泛型类集成泛型接口依赖注入 bug #I294YT
    • [修复] Swagger 不支持 new 覆盖父类的 bug #I28Z1A
    • [修复] JsonSerializerUtility 没有公开 bug #I28WMI
    • [修复] SqlSugar 拓展查询泛型类型注册异常 bug #I28VMT
    • [修复] Furion Tools 不支持生成不同命名空间的实体 bug #I2A175
    • [修复] 全局拦截器无效 bug #I2A7T2
    • [修复] 新增或更新忽略空值空异常 bug #I2AB6C
  • 其他更改

    • [优化] Token 生成加密算法 #I29KIH
  • 文档变化

    • [新增] 日志文档 #I28Y9D
    • [调整] 数据库上下文、实体拦截器、配置、一分钟入门等等文档
  • 问答答疑

    • [问答] Swagger 如何实现授权访问 #I294F2
    • [问答] 如何实现多个数据库多对多实体配置 #I29G6S
    • [问答] 动态 WebApi 支持文件上传吗 #I29R5E
    • [疑问] 多个数据库上下文无法生成迁移代码 #I2A6II
  • 不做实现

    • [废弃] 实现 BuildChange 传入表名 #I292SN
    • [废弃] 执行数据库操作结果不支持属性忽略大小写赋值 #I29DRQ
    • [废弃] 引入 Webhook 机制 #I2A3I0

v1.4.0(已发布)#

  • 新特性

    • [新增] Furion 支持二级虚拟目录部署功能 #I28B77
    • [新增] Furion.Template.RazorWithWebApi 脚手架 #I28QGI
    • [新增] Furion.Template.BlazorWithWebApi 脚手架 #I27Z3O
    • [新增] EFCore 时态查询拓展 #I28AJ
    • [新增] [AppDbContext(连接字符串,数据库类型)] 配置支持 #I28QTB
    • [新增] DateTimeOffsetDateTime 拓展方法 #I27MQA
    • [新增] ValidationTypes 验证正则表达式智能提示 #I2801V
    • [新增] ValiationTypes.WordWithNumber 验证 #I2805
    • [新增] 获取客户端和服务端 IP 地址 #I28QV9
  • 突破性变化

    • [升级] .NET 5.0 版本至 .NET 5.0.1 版本 #I28QU
    • [重构] 视图引擎功能,优化不规范命名和新增字符串模板编译 #I28G0S
    • [重构] 数据库实体查找算法,并优化性能 #I28QUQ
    • [优化] 应用启动初始化性能和数据库第一次自动配置 DbSet 性能
  • 问题修复

    • [修复] 多数据库上下文配置定位器后实体无法正确生成 bug #I2888L
    • [修复] 多租户数据库上下文实体生成 bug #I2891G
    • [修复] 对象验证失败提示消息没有应用 JSON 大小写配置 bug #I27UTX
    • [修复] 仓储 InsertUpdate 方法指定 ignoreNullValues 无效 bug #I27UN6
    • [修复] Controller 派生类如果贴了 [Route] 特性后出现在 Swagger 中 bug #I27TN7
    • [修复] SqlScalar 执行 sql 返回 Nullable 类型出现转换失败 bug #I27S2N
    • [修复] [UnitOfWork] 特性异常 bug #I27MLM
    • [修复] sql 静态执行方式和 sql 高级代理无法监听数据库连接状态 bug #I27M4F
    • [修复] 修复更换 Json 序列化库无效 bug,如替换为 Microsoft.AspNetCore.Mvc.NewtonsoftJson #I27M43
    • [修复] Furion Tools 工具生成模型 bug #I27XI5
    • [修复] 软删除没有生效 bug #I2804I
    • [修复] Furion Tools 识别带多个 \\ 的连接字符串识别 bug #I280TS#PR91
    • [修复] Furion Tools 无法取消生成 bug #I2816M
    • [修复] DateTimeOffset 转本地时间差 8 小时 bug #I28BA9
    • [修复] 启用 bundle js&css 压缩后启动异常 bug #I28KR
    • [修复] ValidationTypes.Required 无效 bug #PR98
    • [修复] 规范化结果OnValidateFailed 参数名拼写错误 bug #PR93#PR92
    • [修复] 授权管道验证失败还显示结果 bug #PR89
  • 其他更改

    • [更新] README.md 友情连接地址 #PR88
    • [更新] 模板脚手架源码,添加 EFCore Tools#PR87
    • [更新] README.md Nuget 图标 #PR85
    • [废弃] 将 List<T>DateTable #PR97
  • 文档变化

    • [新增] 视图引擎模板文档 #I27ZVA
    • [新增] EFCore 时态查询文档 #I28AJ, DOC
    • [更新] 仓储文档书写纰漏 bug #PR90
    • [更新] 选项文档错误 bug #PR86
    • [更新] 实体数据监听器 文档书写错误 bug #PR83
    • [更新] 数据库上下文、多数据库、脚手架等文档
  • 问答答疑

    • [建议] 希望 api 返回的值自动将 null 转为 '' 或 [][#I286IJ](https://gitee.com/dotnetchina/Furion/issues/I286IJ),【已关闭】
    • [建议] 添加网关功能 #I27TP7,【已关闭】
    • [建议] 新增 SqlQuery<T> 获取单条记录方法 #I28M1V,【已关闭】
    • [建议] 希望可以提供集成 Serilog 例子 #I282J4,【已关闭】
    • [疑问] 如何通过特性配置唯一约束 #I2891L,【已关闭】
    • [疑问] 怎么读取 appsettings.json 数组 #I27WU,【已关闭】
    • [疑问] IRepository<TEntity> 出现空异常 #I281IE,【已关闭】
    • [疑问] 规范化接口问题问题 #I28NMZ,【已关闭】
    • [疑问] 统一返回值模型中 OnResponseStatusCodes 未执行 #I28NNL,【已关闭】

v1.2.0(已发布)#

  • 新特性

    • [新增] 雪花算法 #I26OXG, #PR78
    • [新增] [AppDbContext] 配置数据库提供器支持 #I27G3T
    • [新增] 实体表数据更改监听接口 IEntityDataChangedListener #I278DD, #I278LQ
    • [新增] 全局服务接口 AOP 拦截功能 #I278CP
    • [新增] 定位器仓储 IDbRepository<TDbContextLocator> #I276Q3
    • [新增] 数据库操作 InsertOrUpdate 支持排除空字符串功能 #I272OG
    • [新增] 数据库操作 UpdateIncludeUpdateExclude 匿名对象支持 #I271X0
    • [新增] 数据验证传入空对象跳过验证支持 #I273R4
    • [新增] 应用启动时支持排除特定配置文件自动加载 #I26U0A
    • [新增] 单个实体表名前缀支持 #I26LX0
    • [新增] MySql 数据库自动配置默认版本号 #I26XQ6
    • [优化] 授权处理程序代码
  • 突破性变化

    • [新增] 实体表数据更改监听接口 IEntityDataChangedListener #I278DD, #I278LQ
    • [新增] 全局服务接口 AOP 拦截功能 #I278CP
    • [新增] 雪花算法 #I26OXG, #PR78
  • 问题修复

    • [修复] 视图引擎加载外部程序集出错 bug
    • [修复] 依赖注入代理接口报空对象异常 bug
    • [修复] EFCore 取消附加实体出错 bug
    • [修复] 数据库仓储在非 Web 请求下出现空异常 bug
    • [修复] 多个授权策略共存问题出现无效 bug
    • [修复] 友好异常 Oop.Oh 不支持普通方法 bug
    • [修复] 获取多租户对象时数据库上下文出现作用域验证失败 bug
    • [修复] 工作单元不支持 Sql代理 拦截 bug #I27GST
  • 其他更改

  • 文档变化


v1.1.0(已发布)#

  • 新特性

    • [新增] Db.GetDbContext() 获取默认数据库上下文方法
    • [新增] HttpContextUtility.GetCurrentHttpContext() 获取全局 HttpContext 上下文
    • [新增] App.GetRequiredService<> 解析服务方法
    • [新增] object.GetService<> 对象拓展方法
    • [新增] 策略授权 PolicyPipeline 基类方法,支持多重判断授权
    • [新增] JWTEncryption.ValidateJwtBearerToken 手动验证静态方法
    • [新增] 全局数据库上下文 InsertOrUpdateIgnoreNullValuesEnabledEntityStateTracked 全局配置
    • [新增] Swagger Jwt授权 全局授权参数 #I26GLR
    • [新增] InsertOrUpdate 支持自定义判断条件功能 #I269Q1
    • [新增] 字符串字段小写命名支持 #I2695D
    • [新增] 字符串文本对比功能 #I268LE
    • [新增] 全局异常特性消息功能 #I2662O
    • [新增] InsertUpdate 数据库忽略空值功能 #I264Q4
  • 突破性变化

    • [调整] Fur 项目名为 Furion
    • [调整] Db.GetRequestDbContext<>() 命名为 Db.GetDbContext<>()
    • [调整] Db.GetDbContext<>() 命名为 Db.GetDuplicateDbContext<>()
    • [重构] App.GetService<> 解析服务的底层逻辑,大大提高了解析服务的性能
    • [重构] 授权核心代码,保持和微软一致的授权规范 #I26DCB
    • [移除] App.GetRequestService<> 方法
    • [移除] ValidateJwtBearer Jwt 授权方法,无需手动判断了
  • 问题修复

    • [修复] Furion 官方脚手架生成后编译异常 bug
    • [修复] Tenant 内置属性不是 virtual 修饰 bug
    • [修复] dockerfile 新命名构建失败 bug
    • [修复] 自定义角色授权和多个授权共存出现 403 bug #I26H1L
    • [修复] httpContext.GetEndpoint() 空异常 bug #PR73
    • [修复] Oops.Oh 空异常和不支持服务服务抛异常 bug #I26EFU#I26GM4
    • [修复] cli.ps 生成文件编码乱码 bug #I26DVT
    • [修复] Swagger 文件上传按钮不显示 #I26B6U
    • [修复] 规范化结果授权状态码序列化大小写不一致问题 #I26B26
    • [修复] 未启用规范化结果时中文乱码 bug #I268T5
    • [修复] MySql 异步异常捕获不到 bug #I265SO
    • [修复] cli.ps1 提示找不到数据库连接字符串 bug #I2647U
  • 其他更改

  • 文档变化

    • [更新] 一分钟入门、安全鉴权、数据库等文档

v1.0.3(已发布)#

  • 新特性

    • [新增] Mvc 模板脚手架:Fur.Template.Mvc
    • [新增] WebApi 模板:Fur.Template.Api
    • [新增] Mvc/WebApi 模板:Fur.Template.App
    • [新增] Razar Pages 模板:Fur.Template.Razor
    • [新增] Blazor 模板:Fur.Template.Blazor
  • 突破性变化

    • [调整] PagedListSystem.Collections.Generic 命名空间下
    • [优化] 解析服务性能问题,底层代码大量优化
  • 问题修复

    • [修复] ApiSears.ControllerEnd不起作用 bug #I25KH6
    • [修复] RemoteRequest 请求完成结果序列化属性大小写问题 #I25I8R
    • [修复] HttpContext.GetEndpoinet() 空异常 bug #PR73
  • 其他更改

  • 文档变化

    • [更新] 入门文档、数据库上下文文档、多数据库操作文档

v1.0.2(已发布)#

  • 新特性

    • [新增] Pomelo.EntityFrameworkCore.MySql 最新 .NET 5 包配置 #I24ZQK
    • [新增] .AddDateTimeJsonConverter(format) 时间格式序列化配置
    • [新增] DateTimeDateTimeOffset 类型序列化格式配置 #I253FI
  • 突破性变化

    • [更新] Mapster 包至 7.0.0
    • [调整] App.Services 名为 App.ServiceProvider
    • [移除] App.ApplicationServicesApp.GetRequestService<>()
    • [移除] 非 Web 主机注入拓展
  • 问题修复

    • [修复] services.AddFriendlyException() 缺少配置注入 bug
    • [修复] 数据库上下文池被释放和高并发下内存溢出 bug #I2524K#I24UMN
    • [修复] Sql代理 返回空数据时异常 bug #I24TCK
    • [修复] 工作单元 [UnitOfWork] 多数据库被释放 bug #I24Q6W
  • 其他更改

    • [调整] EntityBaseEntity 所有属性为 vitural 修饰
    • [优化] Jwt 读取和解析性能
    • [优化] 优化代码支持 C# 9.0 最新语法
    • [优化] MD5 加密性能 #PR71
    • [移除] 无用或未使用代码
  • 文档

    • [更新] 数据库上下文、多数据库、一分钟入门文档

v1.0.0(已发布)#

  • 新特性

    • [新增] 网络请求 RemoteRequest 组件 #I1YYWD
    • [新增] .AddInjectBase() 注入,只包含基础服务注入
    • [新增] 所有服务都支持 IServiceCollectionIMvcBuilder 注入
    • [新增] 抛异常状态码设置功能 StatusCode
    • [新增] Swagger 序列化支持 Pascal 属性命名方式
  • 突破性变化

    • [更新] 所有的包为 .NET 5 正式版
  • 问题修复

    • [修复] SqlProxy 代理异步处理 bug
    • [修复] 数据库类型 DatetimeDateTimeOffset bug
    • [修复] 属性首字母大小写序列化不匹配出现 null bug
    • [修复] 对象序列化中文出现乱码 bug
    • [修复] 默认序列化配置无效 bug
    • [修复] 数据库非依赖注入方式提交无效 bug
    • [修复] 应用程序池提交所有 DbContext 空异常 bug
    • [修复] Saas 多租户 Tenant 类型字符串属性在 MySql 数据库下出现 longtext 类型 bug
    • [修复] Mvc 自动验证字符串空值 bug #I24M2T
    • [修复] 枚举注释被覆盖 bug #I24N6J
    • [修复] 忽略规范化结果无效 bug #I24B8P
    • [修复] Swagger 默认 ContentType 不是 applicaiton/json bug #I24F3U
    • [修复] 内置 System.Text.JsonNewtonsoft.Json 冲突 bug #I24F3U
  • 其他更改

    • [调整] Fur 框架域名为:https://furion.pro
    • [调整] 仓储 FromSqlRawFromSqlInterpolated 接口位置
    • [优化] 数据加解密性能,#PR70
  • 文档

    • [更新] README.md、框架介绍、数据库上下文、配置选项、多租户、跨域文档
Last updated on by Monk
- + @@ -30,6 +30,6 @@ - + \ No newline at end of file diff --git a/handbook/build/docs/view-engine/index.html b/handbook/build/docs/view-engine/index.html index 82f957a49c9..8efc8490987 100644 --- a/handbook/build/docs/view-engine/index.html +++ b/handbook/build/docs/view-engine/index.html @@ -8,7 +8,7 @@ 17. 视图引擎 | Furion - + @@ -27,7 +27,7 @@
var template = _viewEngine.Compile<CustomModel>(content);
var result = template.Run(instance =>
{
instance.A = 10;
instance.B = "Alex";
});

结果:

Hello 10, Alex, -=123=-

17.5 IViewEngine 接口#

IViewEngine 提供了简单方便的 RunCompile 方法,也提供了最原始化的 CompileRun 方法。

通过原始的 CompileRun 方法可以实现很多复杂的逻辑和自定义指令集。

/// <summary>
/// 编译模板
/// </summary>
/// <param name="content"></param>
/// <param name="builderAction"></param>
/// <returns></returns>
IViewEngineTemplate Compile(string content, Action<IViewEngineOptionsBuilder> builderAction = null);
/// <summary>
/// 编译模板
/// </summary>
/// <param name="content"></param>
/// <param name="builderAction"></param>
/// <returns></returns>
Task<IViewEngineTemplate> CompileAsync(string content, Action<IViewEngineOptionsBuilder> builderAction = null);
/// <summary>
/// 编译模板
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="content"></param>
/// <param name="builderAction"></param>
/// <returns></returns>
IViewEngineTemplate<T> Compile<T>(string content, Action<IViewEngineOptionsBuilder> builderAction = null)
where T : IViewEngineModel;
/// <summary>
/// 编译模板
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="content"></param>
/// <param name="builderAction"></param>
/// <returns></returns>
Task<IViewEngineTemplate<T>> CompileAsync<T>(string content, Action<IViewEngineOptionsBuilder> builderAction = null)
where T : IViewEngineModel;

17.6 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by Monk
- + diff --git a/handbook/build/docs/virtual-deploy/index.html b/handbook/build/docs/virtual-deploy/index.html index b23dabc4bbc..a3df8637252 100644 --- a/handbook/build/docs/virtual-deploy/index.html +++ b/handbook/build/docs/virtual-deploy/index.html @@ -8,7 +8,7 @@ 28.4 二级虚拟目录部署 | Furion - + @@ -22,7 +22,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

28.4 二级虚拟目录部署

28.4.1 关于二级虚拟目录#

通常我们的站点都是部署在网站的根目录下的,但是有些时候,我们可能将网站根目录下的目录作为二级站点或子站点,这个时候,就会出现 404 错误了。

这个时候就需要进行一些特殊配置了。

28.4.1.2 配置 Startup.cs#

首先,我们需要配置 Startup.cs 中的 Configure,如:

public void Configure(IApplicationBuilder application, IWebHostEnvironment env)
{
application.Map("/二级目录", app=>
{
// 其他中间件代码全部在这里面写
});
}

28.4.1.3 启用 Swagger 虚拟目录支持#

第二步,在 appsettings.json 配置文件(其他配置文件也可以)中添加以下配置:

{
"SpecificationDocumentSettings": {
"VirtualPath": "/二级目录"
}
}

28.4.2 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by Monk
- + diff --git a/handbook/build/index.html b/handbook/build/index.html index 43dbe1dfc29..83cd30855a8 100644 --- a/handbook/build/index.html +++ b/handbook/build/index.html @@ -8,7 +8,7 @@ 让 .NET 开发更简单,更通用,更流行。 Furion | Furion - + @@ -26,7 +26,7 @@
[IfException(1000, "用户ID: {0} 不存在")]
public async Task<UserDto> GetUser([Range(1, int.MaxValue)] int userId)
{
var user = await _userRepository.FindOrDefaultAsync(userId);
_ = user ?? throw Oops.Oh(1000, userId);
return user.Adapt<UserDto>();
}
public async Task<RemoteData> GetRemote(string id)
{
var data = await $"https://www.furion.pro/data?id={id}".GetAsAsync<RemoteData>();
return data;
}
}

完全开源免费

代码托管在开源中国 Gitee

3750
Stars
1100
Forks
128,327
Downloads

功能模块

麻雀虽小五脏俱全

大量使用者测评

来听听他们是怎么说的

理想和现实

作者的技术是我接触.NET程序员中最好的一个,代码的质量,文档的质量都是一等一的。

kesshei

强烈支持,因为有你们,.net 会走的更远。

逆天的蝈蝈

非常优秀的开源作品,点赞支持

张芸溪

大概看了一下,觉得项目非常棒。core生态一定能火

赖皮小鳄鱼

作者好棒,支持国内.net!

gudufy

做得非常棒,打算基于你的框架做一个基本的后台管理出来,供大家快速开发中小型项目。

ThinkCoder

文档写的真不错,代码质量也非常高,注释非常完善,赞一个。

liuina

期待文档写完的那一天,绝对惊艳四座。

weiyu.xiao

很不错的项目,对快速搭建健壮的技术架构,帮助业务成功很有帮助。

我们的客户

我们的软件包已在全球多个项目中使用。从小型企业到企业的解决方案及知名企业。公司在简单软件和复杂管理系统的开发方面都信任我们。

立即添加您的公司
- + diff --git a/handbook/build/search/index.html b/handbook/build/search/index.html index 3c37dc6c1fa..8b87e85fd7b 100644 --- a/handbook/build/search/index.html +++ b/handbook/build/search/index.html @@ -8,7 +8,7 @@ Search the documentation | Furion - + @@ -25,7 +25,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

Search the documentation

- + diff --git a/samples/Furion.Core/Furion.Core.csproj b/samples/Furion.Core/Furion.Core.csproj index 30564c93e42..dd451718eb7 100644 --- a/samples/Furion.Core/Furion.Core.csproj +++ b/samples/Furion.Core/Furion.Core.csproj @@ -11,8 +11,8 @@ - - + +