我想通过Entity Framework中的adhoc查询检索下一个序列号。 我正在使用:
LogEntities db = new LogEntities();
ObjectQuery<Int64> seq = db.CreateQuery<Int64>("SELECT AUDITLOG.EVENTID_SEQ.NEXTVAL from sysibm.sysdummy1");
这会返回以下错误:
ErrorDescription =“'sysibm.sysdummy1'无法在当前作用域或上下文中解析。请确保所有引用的变量都在作用域中,加载了所需的模式,并正确引用了名称空间。”< / em>的
我想这是因为sysdummy1不是我模型中的映射表。
任何人都知道我可以使用LINQ 2实体上下文执行此查询的方法吗?
答案 0 :(得分:1)
ObjectQuery需要使用Entity SQL,而不是“常规”SQL。如果要编写“常规”SQL,则需要使用存储连接,而不是ObjectQuery。也就是说,我有点想知道你为什么要手动检索序列号。如果在服务器上将entity属性设置为auto increment,则在SaveChanges时会自动检索。如果您需要获取商店连接,EntityConnection类型CreateDbCommand上有一个方法可以执行此操作。我再次建议你不要这样做。使用此功能可使您的代码提供程序特定。大多数实体框架代码应该与提供者无关。
答案 1 :(得分: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中调用存储过程的方法,它返回一个标量。
答案 2 :(得分:0)
另一种选择是创建一个带有标识列的表,并在插入后使用来自identity val函数的值。