[オープンソース]FreeSqlツール、Razorテンプレートに基づいて最高の互換性を実現するジェネレータ

6844 ワード

FreeSqlは半年の開発と維持を経て、0.6.xバージョンでは、いくつかの重要なイベントが完了しました.
1、パケットごとに分割し、各データベースは単独dllとして実現する.
2、実現する.Netframework 4.5サポート;
3、MySqlを同時にサポートする.Data、MySqlConnectorの実現;
4、ナビゲーション属性関係の構成をカスタマイズする.
5、セットツールFreeSql.Toolsリリース;
本文は主に第5项《FreeSql.Tools》を说明して、主役は往々にして最后にやっと现れます!!!

パケットの分割


これまでFreeSqlの肥大化にツッコミを入れられてきたが、小さなパッケージ開発の理念はなかった.実は私はこのような評価を少しも認めません.最初はFreeSqlが1つしかありませんでしたが.dllですが、開発と計画は簡単です.
早すぎる最適化は悪夢だという開発原則がある.
どんなプロジェクトをしても、最初からシステム的で規範的な実行を考えないでください.外部から見れば正規ですが、進捗と安定性が大幅に低下します.私を信じなくてもいいですが、前人の総括を信じてください!!!
前のdllから小さなパッケージに分割するまで、私たちは全部で2日間かかりました.1つのプロジェクトで開発されていますが、結合性は高くありません.so easy!!
車が山に着く前に必ず道があるので、タイミングが来たら自然に分解します.このタイミングはFreeSqlが安定の鍵を踏み出した一歩でもある.これにより、FreeSql陣営に参加したい人が増えます.
  • 各データベースの個別パケット、遅延ロードパケット;
  • FreeSql.Extensions.LazyLoading
  • FreeSql.Provider.MySql
  • FreeSql.Provider.PostgreSQL
  • FreeSql.Provider.SqlServer
  • FreeSql.Provider.Sqlite
  • FreeSql.Provider.Oracle

  • 支持するnetframework 4.5


    初期のFreeSqlは主に.Netcoreで一番便利なORM!NETStandardは新しい標準ですが、この間マイクロソフトはまた言いました.Net 5がマージされます...変化が本当に速すぎる.
    パケットの分割が実現されると、FreeSqlのモジュールはより明確になり、依存項目が非常に少なくなり、4.5 frameworkの適合が容易になります.
    現在サポートされているバージョン:
    Package Name
    Version
    FreeSql.Provider.MySql
    NETStandard2.0、net452
    FreeSql.Provider.PostgreSQL
    NETStandard2.0、net45
    FreeSql.Provider.SqlServer
    NETStandard2.0、net451
    FreeSql.Provider.Sqlite
    NETStandard2.0、net45
    FreeSql.Provider.Oracle
    NETStandard2.0、net45
    FreeSql.Extensions.LazyLoading
    NETStandard2.0、net45

    MySqlConnectorの実装


    mysqlは不思議な流行データベースです.Net陣営では使用量が2番目に多い.mysqlのバージョンは様々で、5.6から異なる分岐があり、分岐の出現はado.Netドライバは通用しません.
    多くの人がMySqlをお勧めしません.Data公式ドライバですが、FreeSqlは官駆を使用しており、enum/setなど5.6タイプすべてをサポートしています.
    それからいくつか人がいて、特に達人のあれらは要求を出して、MySqlConnectorの実現に適して、それから有名なA大(お茶のおじさん)はPRを出して、FreeSqlを作りました.Provider.MySqlConnectorプロジェクト、99.9999%ソースコードと元のFreeSql.Provider.MySqlは同じで、266ユニットのテストを経て、enum/setタイプと互換性があり、パラメータ化する必要があることが分かった.@の処理が通りました.新しいドライブパッケージが用意されました
    Package Name
    Version
    FreeSql.Provider.MySqlConnector
    NETStandard2.0、net45
    そしてFreeSqlBuilderは反射を用いてどのmysqlで駆動するかを決定する.コードは次のとおりです.
    public IFreeSql Build() {
        if (string.IsNullOrEmpty(_masterConnectionString)) throw new Exception("   masterConnectionString     ,    UseConnectionString");
        IFreeSql ret = null;
        Type type = null;
        switch(_dataType) {
            case DataType.MySql:
                type = Type.GetType("FreeSql.MySql.MySqlProvider`1,FreeSql.Provider.MySql")?.MakeGenericType(typeof(TMark));
                if (type == null) type = Type.GetType("FreeSql.MySql.MySqlProvider`1,FreeSql.Provider.MySqlConnector")?.MakeGenericType(typeof(TMark));
                if (type == null) throw new Exception("   FreeSql       :FreeSql.Provider.MySql.dll,    nuget   ");
                break;
            case DataType.SqlServer: type = Type.GetType("FreeSql.SqlServer.SqlServerProvider`1,FreeSql.Provider.SqlServer")?.MakeGenericType(typeof(TMark));
                if (type == null) throw new Exception("   FreeSql       :FreeSql.Provider.SqlServer.dll,    nuget   ");
                break;
            case DataType.PostgreSQL: type = Type.GetType("FreeSql.PostgreSQL.PostgreSQLProvider`1,FreeSql.Provider.PostgreSQL")?.MakeGenericType(typeof(TMark));
                if (type == null) throw new Exception("   FreeSql       :FreeSql.Provider.PostgreSQL.dll,    nuget   ");
                break;
            case DataType.Oracle: type = Type.GetType("FreeSql.Oracle.OracleProvider`1,FreeSql.Provider.Oracle")?.MakeGenericType(typeof(TMark));
                if (type == null) throw new Exception("   FreeSql       :FreeSql.Provider.Oracle.dll,    nuget   ");
                break;
            case DataType.Sqlite: type = Type.GetType("FreeSql.Sqlite.SqliteProvider`1,FreeSql.Provider.Sqlite")?.MakeGenericType(typeof(TMark));
                if (type == null) throw new Exception("   FreeSql       :FreeSql.Provider.Sqlite.dll,    nuget   ");
                break;
            default: throw new Exception("    UseConnectionString");
        }
        ret = Activator.CreateInstance(type, new object[] { _masterConnectionString, _slaveConnectionString }) as IFreeSql;
        if (ret != null) {
            ret.CodeFirst.IsAutoSyncStructure = _isAutoSyncStructure;
            
            ret.CodeFirst.IsSyncStructureToLower = _isSyncStructureToLower;
            ret.CodeFirst.IsSyncStructureToUpper = _isSyncStructureToUpper;
            ret.CodeFirst.IsConfigEntityFromDbFirst = _isConfigEntityFromDbFirst;
            ret.CodeFirst.IsNoneCommandParameter = _isNoneCommandParameter;
            ret.CodeFirst.IsLazyLoading = _isLazyLoading;
            var ado = ret.Ado as Internal.CommonProvider.AdoProvider;
            ado.AopCommandExecuting += _aopCommandExecuting;
            ado.AopCommandExecuted += _aopCommandExecuted;
        }
        return ret;
    }

    ナビゲーション属性関係の設定のカスタマイズ


    FreeSqlはもともと規則的なナビゲーション関係の配置をサポートしており、新しいプロジェクトの開発には約束できるに違いないが、多くの古いプロジェクトの命名が規範化されていないと関連する機能が使用できない.
    コンフィギュレーションについてはgithub wikiセンタードキュメントを参照してください
    QQ開発グループは本当に良いプラットフォームで、討論を始めた後、皆さんは次々と提案を出して、最後に一票で各提案を否決しました.
    主に文法とユーザーの使用の感じから設計して、やはりその理念:日本式の簡潔さ!多くの特性と機能を加えることができず、ユーザーの理解と使用コストを増やすことができます.
    最終的な効果は次のとおりです.
    //    ,OneToMany
    
    [Navigate("Song_id")]
    public virtual List Obj_song_tag { get; set; }
    
    //    ,ManyToOne/OneToOne
    [Navigate("Song_id")]
    public virtual song Obj_song { get; set; }
    
    [Navigate("Tag_id")]
    public virtual tag Obj_tag { get; set; }

    そして多くのナビゲーションの騒々しい操作機能を使うことができます.

    付属工具FreeSql.Toolsリリース(主人公の圧巻)


    このツールの著者:mypeng 1985と参考者:movingsam
    親切な利用者たちがいて、FreeSqlの生態を助けてくれてありがとう!!
    FreeSqlは初期にジェネレータテンプレートを作ったことがありますが、機能は秘密で、一般の人はどのように使うか分かりません.その後はCodeFirstの機能開発に夢中になり、抜け出せませんでした.
    そして10日前、突然FreeSqlが多くの利用者を感じて、この时間はもちろんデータベースからエンティティを生成する需要があります!!
    Q:そんなことをする必要はないですよね.市場が多いですね.あるいは、テンプレートを作って、全部できましたか.
    A:
  • は100%タイプの互換性がありません.FreeSqlがサポートしているタイプは本当に深いので、市場のタイプマッピングは100%マッチングできません.
  • より多くの機能を掘り起こすために、ジェネレータはナビゲーション属性のサポートを必要とします.これは基本的なことです.ナビゲーション属性があると、FreeSql操作が多くなるからです.

  • もともと私は純粋なwinformのジェネレータプロジェクトを始めましたが、インタフェースは以下のようにしました.
    きれいだと思いますか?きれいだと思います...他の人は醜いと思っている.私は群発を開発して皆さんに見せた後、翌日FreeSql.Toolsプロジェクトでは、次のような新しいインタフェースが作成されました.
    直接秒殺されたのは作者:mypeng 1985の佳作だ.
    インタフェースはとてもwebのように見えますが、実はそうではありません.まだwinformプログラムで、htmlを使ってインタフェースをして、c#は操作機能をしています.

    終わりの言葉


    ソースアドレス:https://github.com/2881099/FreeSql.Tools
    FreeSqlは2018年11月28日に審査され、開発され、今日0.6.x、ユニットテスト1600+、生態も次第に完備して、多くのネットユーザーの励ましと支持を得て、あなたたちに感謝します!プロジェクトに参加してくれた皆さんに感謝します!