1

同期手順を書こうとしています。ローカル データベースへの変更のログ テーブルがあり、それらをリモート データベースに適用したいと考えています。

エンティティセット名と RowId という一意のフィールドの値がわかっている場合は、ログ エントリごとにリモート データベースで対応するレコードを見つける必要があります。RowId は主キーではありません。

コンテキスト クラス内に以下を入れようとしましたが、新しいドメイン クラスを追加するたびにコードを編集する必要があることを意味します。

巨大な switch ステートメントを使用せずに手順を記述する方法はありますか? Entity Framework の GetObjectByKey メソッドに似たメソッド

これが私が置き換えたい巨大なswitchステートメントです

public object GetObjectByRowId(string EntitySetName, Guid RowId)
{
    switch ("People")
    {
        case AppDataEnum.People:
            return People.SingleOrDefault(x => x.RowId == RowId);
            break;

等..

すべてのエンティティに IRowId インターフェイスを実装させることで解決できるかもしれませんが、EF に組み込みの方法があることを願っています。

ここで関連する質問をしました

ここでの答えが役立つと思います。そのシナリオでは、多くのタイプが同じテーブルから抽出されています。私のシナリオでは、多くのテーブルに RowId フィールドがあります。

Public Class Person : LoggedEntity
{
 public string FirstName { get; set; }
 public string LastName { get; set; }
}

パブリック クラス 組織 : LoggedEntity { public string FirstName { get; 設定; } パブリック文字列 LastName { get; 設定; } }

Public Class LoggedEntity
{  [Key]
    public int Id { get; set; }
    public Guid RowId { get; set; }
}
4

2 に答える 2

1

この場合、一意のキーはタイプ + 一意の識別子のタプルで構成されます。あなたの質問を正しく理解している場合、行 ID は特定のタイプごとに一意ですが、タイプの異なる 2 つのオブジェクトが同じ行 ID を持つ場合があります。

GetHashCode をオーバーライドして、型と行 ID の組み合わせに基づいて一意のハッシュを作成できます。適切なハッシュ関数を考え出す方法は、この質問の範囲を超えていますが、非常に愚かな解決策として、 (Type.Name + RowId).GetHashCode() のようなことを行うことができます

これにより、2 つを連結した文字列のハッシュ コードが返されます。その時点から、すべてを HashSet に入れるだけで、オブジェクトを効率的に取得できます。

効率が問題にならない場合は、各タイプのオブジェクトをそれぞれのリストで追跡し、特定のタイプを探すときは、関心のあるタイプのオブジェクトのリストを反復処理して、特定の RowId を探します。

于 2012-12-25T22:44:51.930 に答える
0

答えがジェネリックに関係していることに気付いた後、私はついに得ました

    public TEntity GetEntityByRowId<TEntity>( Guid rowId) where TEntity : LoggedEntity
    {
        return Db.Set<TEntity>().SingleOrDefault(x => x.RowId == rowId);
    }
于 2013-02-22T02:53:53.363 に答える