0

ASPMVCにRailsActiveRecord:: Callbacksに相当するものはありますか?

http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html

主キーにIDを使用していない状況にあります。これは、DBシャーディング設計に固有の理由で行います。このため、特定のテーブルの次のIDを見つけるためのルックアップテーブルがあります。モデルが作成/更新されるたびに、また保存される前に、この値を自動的に取得して抽象クラスに設定したいと思います。また、保存が成功した後、増分された「nextID」でルックアップテーブルを更新する必要があります。

コールバックなしでこれを行う方法についても、他の解決策を受け入れています。

4

2 に答える 2

0

では、ルックアップテーブルのIDをインクリメントするためだけにコールバックが必要ですか?ASP.NETには同等のものはありません。非同期コントローラー(http://msdn.microsoft.com/en-us/library/ee728598%28v=vs.100%29.aspx)を試して、保存が成功したことによる状態の変化ですが、Snowflake( https://github.com/twitter/snowflake/ )のようなこの専用のサービスを使用したいと思います。

于 2013-02-21T22:01:48.670 に答える
0

コールバックではなくオーバーライドを使用する解決策を見つけました。コールバックは、一元化されたDbContextクラスではなく、イベントが関係するモデルに存在することを許可することで、よりクリーンなコードを可能にするため、フレームワークが成熟し続けるにつれて、ASPmvcがコールバックのサポートを追加することを願っています(懸念)。

解決:

SaveChangesメソッドはContextClassでオーバーライドできます(Entity Framework Power ToolsはContextクラスを'Models'ディレクトリに作成します)。

    public override int SaveChanges()
    {
        // create a cache for id values in case their are multiple added entries in the dbcontext for the same entitytype
        Dictionary<string, UniqueID> idCache = new Dictionary<string, UniqueID>();
        IEnumerable<DbEntityEntry> changes = this.ChangeTracker.Entries();
        foreach (var entry in changes)
        {
            //check if this is a new row (do nothing if its only a row update because there is no id change)
            if (entry.State == System.Data.EntityState.Added)
            {
                //determine the table name and ID field (by convention)
                string tableName = entry.Entity.GetType().Name;
                string idField = entry.Entity.GetType().Name + "ID";
                UniqueID id = null;
                //if we've already looked this up, then use the cache
                if (idCache.ContainsKey(tableName))
                {
                    id = idCache[tableName];
                }
                //if we havn't looked this up before get it and add it to the cache
                else
                {
                    id = this.UniqueIDs.Find(tableName, idField);
                    //if it doesn't already exist in the lookup table create a new row
                    if (id == null)
                    {
                        id = new UniqueID(tableName, idField, 1);
                        // since this is a new entry add it
                        this.UniqueIDs.Add(id);
                    }
                    else
                    {
                        // set the state to modified
                        this.Entry(id).State = System.Data.EntityState.Modified;
                    }
                }
                entry.CurrentValues[tableName + "ID"] = id.NextID;
                id.NextID = id.NextID + 1;
            }

        }
        return base.SaveChanges();
    }
于 2013-02-25T17:04:26.763 に答える