【问题标题】:Generic findById with Entity Framework and composite keys具有实体框架和复合键的通用 findById
【发布时间】:2015-10-30 13:06:07
【问题描述】:

我有一个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 文件的帮助下从数据库生成的。在我的例子中,两列都设置为主键。在调试器中,我清楚地看到 key 是 short[2] 类型。

我认为这可能与以下事实有关只要我将一个数组传递给我的findById() 方法...

【问题讨论】:

    标签: c# entity-framework


    【解决方案1】:

    您需要将键值转换为对象数组,即object[]

    我建议你替换这个:

    data = set.Find(key);
    

    用这个:

    if(key is Array)
    {
        data = set.Find((key as IEnumerable).Cast<object>().ToArray());
    }
    else
    {
        data = set.Find(key);
    }
    

    【讨论】:

    • 谢谢!我知道是这样的,但我想不出正确的方法来转换我的参数......
    【解决方案2】:

    为什么不使用paramsparamsobject 将解决这个问题。

    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 方法只接受object 的数组。看看https://msdn.microsoft.com/en-us/library/gg696418(v=vs.113).aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-1

    【讨论】:

    • 我的参数是一个短数组的事实可能是问题所在,谢谢。我最终使用了 Yacoub 的解决方案,但您帮助我了解了问题所在。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2011-11-05
    • 1970-01-01
    • 2014-12-09
    • 1970-01-01
    • 1970-01-01
    • 2012-06-04
    • 1970-01-01
    • 2013-05-20
    相关资源
    最近更新 更多