0

私たちのデータベースには、short と int を組み合わせたキーが存在するすべてのテーブルに主キーが定義されています。したがって、Entity Framework を使用して、要素のメソッドを呼び出して要素を見つけようとすることができますContext.DbSet<>.Find(params object[] parameters)。私たちのコードでは、これは次のようになります。

public Client FindClient(short sqlId, int incId)
{
  Context db = new Context();
  Client result = db.Clients.Find(sqlId, incId);
  return result;
}

ただし、このコードでは、構造体を使用してキー値を格納しています。構造体は次のとおりです。

public struct DbKey
{
  private short _SqlId;
  private int _IncId;
  public short SqlId { get { return _SqlId; } }
  public int IncId { get { return _IncId; } }

  public DbKey(short SqlId, int IncId)
  {
    this._SqlId = SqlId;
    this._IncId = IncId;
  }

他の比較メソッドなどがあります。次のように DbSet.Find メソッドを呼び出せるようにしたいと考えています。

public Client FindClient(DbKey key)
{
  Context db = new Context();
  Client result = db.Clients.Find(key);
  return result;
}

これを可能にするために、このメソッドの拡張オーバーロードを作成しました。

public static partial class Extensions
{
  public static T Find<T>(this DbSet<T> dbset, DbKey key) where T : class
  {
    return dbset.Find(key.IncId, key.SqlId);
  }
}

Intellisense は、Find メソッドがオーバーロードされていることを通知するようになりました。一方のバージョンDbKey keyはパラメーターとして受け入れられ、もう一方の元のメソッドはパラメーターとして受け入れられますparams object[] parameters。ただし、コードを実行すると、関数は常に元のメソッドを呼び出し、オーバーロードされたメソッドを呼び出すことはありません。これは、DbKey も元のパラメーターと一致し、例外が発生するためです。どうすればこの問題を解決できますか?

4

1 に答える 1