我有findById()
方法的通用版本(KeyType
和EntityType
是类级别的模板参数):
public EntityType findById(KeyType key)
{
log.LogDebugStart();
log.LogDebug("id=" + key);
EntityType data;
using (ObjectContextWrapper contextWrapper = TransactionHelper.GetContextWrapper())
{
Entities bdd = contextWrapper.GetContext();
DbSet<EntityType> set = bdd.Set<EntityType>();
data = set.Find(key);
}
log.LogDebugEnd();
return data;
}
它适用于单列密钥(例如:KeyType = long),但我无法使用复合主键(例如:KeyType:long [])。
我得到的例外:
传递的主键值的数量必须与主数量相匹配 在实体上定义的键值。参数名称:keyValues
在.edmx
文件的帮助下,从数据库生成实体。在我的情况下,两列都设置为主键。在调试器中,我很清楚该键的类型为short [2]。
我认为这可能与我的方法没有采取&#34; params&#34;参数,并且不知何故整个数组将作为单个参数传递给Find()
方法,但只要我将数组传递给findById()
方法就可以了......
答案 0 :(得分:4)
您需要将键值转换为对象数组,即DELETE where ... and Deleted=1
INSERT ..., Deleted=0
。
我建议你更换一下:
object[]
用这个:
data = set.Find(key);
答案 1 :(得分:1)
为什么不使用params
? params
的{{1}}将解决此问题。
object
请注意,public EntityType findById(params object[] keys)
{
log.LogDebugStart();
log.LogDebug("id=" + keys.Aggregate((a, b) => a.ToString() + ", " + b.ToString()));
EntityType data;
using (ObjectContextWrapper contextWrapper = TransactionHelper.GetContextWrapper())
{
Entities bdd = contextWrapper.GetContext();
DbSet<EntityType> set = bdd.Set<EntityType>();
data = set.Find(keys);
}
log.LogDebugEnd();
return data;
}
方法只接受Find
的数组。看看https://msdn.microsoft.com/en-us/library/gg696418(v=vs.113).aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-1