1

我想通过实体框架中的即席查询检索下一个序列号。我正在使用:

LogEntities db = new LogEntities();

ObjectQuery<Int64> seq = db.CreateQuery<Int64>("SELECT AUDITLOG.EVENTID_SEQ.NEXTVAL from sysibm.sysdummy1");

这将返回以下错误:

" ErrorDescription = "'sysibm.sysdummy1' 无法在当前范围或上下文中解析。确保所有引用的变量都在范围内,加载了所需的模式,并且正确地引用了命名空间。"

我猜这是因为 sysdummy1 在我的模型中不是映射表。

任何人都知道我可以使用 LINQ 2 实体上下文执行此查询的方法吗?

4

3 回答 3

1

ObjectQuery 需要使用实体 SQL,而不是“常规”SQL。如果要编写“常规” SQL,则需要使用存储连接,而不是 ObjectQuery。也就是说,我有点想知道为什么您要手动检索序列号。如果实体属性在服务器上设置为自动递增,这将在您 SaveChanges 时自动检索。如果您需要获取存储连接,则 EntityConnection 类型上有一个方法CreateDbCommand可以执行此操作。再次,我建议你不要这样做。使用此功能使您的代码提供程序特定。大多数实体框架代码应该与提供者无关。

于 2009-04-16T12:28:18.700 回答
1

感谢您的回答克雷格。我无法使用自动递增标识列的原因是因为这个特定的逻辑表在物理上被划分为 31 个单独的(每日)表,并且 ID 需要在所有表中都是唯一的。

我最终创建了一个存储过程来从序列中检索下一个数字,然后将其添加到我的 EF 模型存储中。

private static long GetNextEventId(DbConnection dbConnection)
{
    using (DbCommand cmd = dbConnection.CreateCommand())
    {
        cmd.CommandText = "LogEntities.GetNextEventId";
        cmd.CommandType = CommandType.StoredProcedure;

        // Execute the command
        return Convert.ToInt64(cmd.ExecuteScalar());
    }
}

这是在 EF 中调用存储过程的另一种方法,它返回一个标量。

使用返回非实体类型的存储过程

于 2009-04-17T07:37:28.957 回答
0

另一种选择是创建一个带有标识列的表,并在插入后使用标识 val 函数中的值。

于 2009-04-20T15:15:45.850 回答