我们的数据库在每个表上都定义了一个主键,该表具有一个短键和一个整数的组合键。因此,使用实体框架,我们可以尝试通过调用元素的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 也匹配原始参数,从而导致异常。我们如何解决这个问题?