【发布时间】:2010-12-23 17:16:32
【问题描述】:
我正在使用 EntityFramework 调用存储过程。但是我在部分实体类中设置的自定义属性为空。 我的 edmx 中有实体(我打电话给 edmx,我不知道该怎么称呼它)。例如,我的数据库中有一个“用户”表,所以我的实体上有一个“用户”类。 我有一个名为 GetUserById(@userId) 的存储过程,在这个存储过程中,我正在编写如下所示的基本 sql 语句
"SELECT * FROM Users WHERE Id=@userId"
在我的 edmx 中,我进行了函数导入以调用此存储过程并将其返回值设置为实体(也从下拉列表中选择用户)。当我像下面这样调用我的存储过程时,它可以完美运行
User user = Context.SP_GetUserById(123456);
但是我在存储过程中添加了一个自定义的新列,以返回一个如下所示的列
SELECT *, dbo.ConcatRoles(U.Id) AS RolesAsString
FROM membership.[User] U
WHERE Id = @id
现在,当我从 SSMS 执行它时,名为 RolesAsString 的新列出现在结果中。 为了在实体框架上工作,我向我的 User 类添加了一个名为 RolesAsString 的新属性,如下所示。
public partial class User
{
public string RolesAsString{ get; set; }
}
但是当我调用它时,这个字段并没有被存储过程填充。 我查看我的 SP_GetUserById 的映射详细信息窗口,此窗口上没有映射。我想添加,但窗口是只读的,我无法映射它。我查看了 edmx 的来源,找不到任何关于 SP 映射的信息。
如何映射这个自定义字段?
【问题讨论】:
-
首先——不要调用你的存储过程
sp_(something)——这个命名是为微软保留的。其次 - 不要在你的存储过程中使用SELECT * FROM...... -
感谢您的评论,为什么您说不要调用“select *”意味着写下所有列名,例如“select Id,Name,Email,....”?
-
是的 - 当字段添加到数据库时,它可以保护您免受额外字段的影响,这可能会破坏您的 DAL,因为它不期望这些字段。切勿在任何地方使用
SELECT *。现在,进入问题 - 您是否更新了模型浏览器中的函数导入? -
是的,我在模型浏览器上更新它,但没有任何反应。我还读到实体框架不查看部分类,因此它不会将“RolesAsString”列映射到实体属性。
-
有人知道这个吗?我遇到了完全相同的情况,想知道是否有其他方法可以做到这一点。
标签: c# stored-procedures entity-framework-4 mapping