3

UpdateCheckすべてのメンバー (主キーを除く)の機能を無効にしたいと考えています。ガイダンスとして以下の例に従っていましたが、テーブルの MetaDataMembers はまだ に設定されていAlwaysます。

http://www.the-lazy-coder.com/2013/04/set-updatecheck-to-never.html

上記のコード スニペットでは、属性を変更するだけですが、実行中にコードをデバッグでき、すべてのプロパティが設定されていることがわかるため、属性の変更は行われないと推測しています。基になるオブジェクトを変更します。

ここで、アプローチを変更して、MetaDataMembers を RowType から直接取得する場合、それらにはUpdateCheckプロパティがあることに気付きますが、ゲッターのみです。このプロパティが設定されたら、(必要に応じてリフレクションを介して) 上書きする方法はありますか? 逆コンパイルされたソースを見ても、それは抽象クラスであり、参照に使用する実装が見つかりません。

私は SQLMetal を使用してコンテキスト ファイルを生成しているため、デザイナーの操作はありません。また、テキスト編集マクロを実行して属性を解析および変更する必要があると言う人もいますが、そうすべきなのに、すべてが長すぎるように思えます。メモリ内のオブジェクトに入り、以前に言われたことを無視するように伝えることができます。

それで!エンティティのプロパティをオーバーライドする方法はありますか? オブジェクトが作成された後、更新を行う直前に、両方のコンストラクターでそのリンクの元のコードを実行しようとしましたが、変更はどれも固執したり、少なくとも重要な場所に伝播したりしていないようで、ほとんどありませんこれをプログラム的に行う方法に関する資料。

4

1 に答える 1

4

インターネットを検索した後、私はそれを行うための良い方法を見つけませんでした.最初に言及したリンクがありますが、部分的に正しい属性で機能するため機能しませんが、上記の場合、彼らは属性に取り組んでいますとにかく、以下のコードは機能しているように見えますが、良くありません:

public static void SetUpdateCheckStatus(this IDataContext dataContext, UpdateCheck updateCheckStatus)
        {
            var tables = dataContext.Mapping.GetTables();
            foreach (var table in tables)
            {
                var dataMembers = table.RowType.DataMembers;
                foreach (var dataMember in dataMembers)
                {
                    if (!dataMember.IsPrimaryKey)
                    {
                        var dataMemberType = dataMember.GetType();
                        if (dataMemberType.Name == "AttributedMetaDataMember")
                        {
                            var underlyingAttributeField = dataMember.GetType().GetField("attrColumn", BindingFlags.Instance | BindingFlags.NonPublic);
                            if (underlyingAttributeField != null)
                            {
                                var underlyingAttribute = underlyingAttributeField.GetValue(dataMember) as ColumnAttribute;
                                if (underlyingAttribute != null)
                                { underlyingAttribute.UpdateCheck = updateCheckStatus; }
                            }
                        }
                        else
                        {
                            var underlyingField = dataMember.Type.GetField("updateCheck", BindingFlags.Instance | BindingFlags.NonPublic);
                            if (underlyingField != null)
                            { underlyingField.SetValue(dataMember, updateCheckStatus); }
                        }
                    }
                }
            }
        }

IDataContext は、モックの目的で DataContext を囲むラッパーにすぎないため、DataContext だけに自由に変更してください。この方法は、必要なデータをすべて持っていない多くのメンバーを引き戻すため、非常に防御的に書かれているため、それらを除外して、必要なデータのみを処理する必要があります。

于 2013-06-14T14:51:10.157 に答える