无法翻译表达式" Error trying to insert using LINQ to SQL classes with custom SP。

4
使用LINQ to SQL类,以下是代码:
clindt.clinDataContext ctx = new clindt.clinDataContext();

clindt.RoleMembership rm = new clindt.RoleMembership();
rm.Created_By ="bob";
rm.Modified_By ="bob";
rm.ProfileID = 2;
rm.RoleID=1;
rm.Created_Date = DateTime.Now;
rm.Modified_Date = DateTime.Now;

ctx.RoleMemberships.InsertOnSubmit(rm);
ctx.SubmitChanges();

我遇到了这个错误:
“无法将表达式'value(clindt.clinDataContext).p_InsertRoleMembership(0, 2, 1, 11/10/2010 2:33:38 PM, "bob", 11/10/2010 2:33:38 PM, "bob")'转换为SQL,并且无法将其视为本地表达式。”
一些额外的信息: 这些类被配置为使用自定义存储过程进行插入。 这个错误只发生在我的3个表格中。有趣的是,它们都在名为'Security'的模式中。每个其他的表都在'dbo'模式中。

你能否包含 RoleMembership 实体的 DBML 定义以及 InsertRoleMembership 存储过程的定义? - KristoferA
2个回答

15

当您尝试添加存储过程但设计器无法确定返回类型时,我见过这种行为,出现如下消息:

"无法检测以下存储过程的返回类型..."

如果您查看生成的 DBML,您将会看到生成的签名:

  <Return Type="object" />
</Function>

后来这个签名会导致你所说的运行时错误。

你可以通过编辑.dbml文件来解决问题:只需将签名更改为正确的返回类型(通常是Int)即可。

  <Return Type="System.Int32" />
</Function>

然后你需要重新构建以重新生成其他文件。

或者如果你喜欢设计师,可以按照以下步骤进行操作:

  • 从 Dbml 中删除该过程,否则您将无法更改返回类型。

  • 添加存储过程并忽略错误“返回类型...”。

  • 进入存储过程(属性|返回类型)并将类型从 Empty 更改为你的类型,在我的例子中是 Int。当弹出消息“This operation cannot be undone ...”时选择'Yes'。返回值将显示为'None',但在内部它将生成一个 Int 返回类型(您可以检查.cs 文件)。

  • 重新构建项目。

现在你应该已经完成了。


0

在将此拖放到 DBML 文件后,您必须确定 SP 输出类型


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接