具有实体框架和组合键的通用findById

时间:2015-10-30 13:06:08

标签: c# entity-framework

我有findById()方法的通用版本(KeyTypeEntityType是类级别的模板参数):

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()方法就可以了......

2 个答案:

答案 0 :(得分:4)

您需要将键值转换为对象数组,即DELETE where ... and Deleted=1 INSERT ..., Deleted=0

我建议你更换一下:

object[]

用这个:

data = set.Find(key);

答案 1 :(得分:1)

为什么不使用paramsparams的{​​{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