实体框架中存储过程的返回值映射

时间:2010-12-23 17:16:33

标签: c# stored-procedures entity-framework-4 mapping

我正在使用EntityFramework调用存储过程。但是我在部分实体类中设置的自定义属性为null。 我的edmx中有实体(我称之为edmx,我不知道该怎么称呼它)。例如,我的数据库中有一个“用户”表,因此我的实体上有一个“用户”类。 我有一个名为GetUserById(@userId)的存储过程,在这个存储过程中我正在编写一个基本的sql语句,如下所示

"SELECT * FROM Users WHERE Id=@userId"

在我的edmx中,我进行函数导入以调用此存储过程并将其返回值设置为Entities(也从下拉列表中选择User)。当我调用我的存储过程时,它可以正常工作

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的Mapping Detail窗口,此窗口上没有映射。我想添加,但窗口是只读我不能映射它。我查看了edmx的来源,找不到任何关于SP的映射。

如何映射此自定义字段?

3 个答案:

答案 0 :(得分:0)

尝试在模型浏览器中将属性添加到User实体。它可能在模型中定义,而不是作为部分类......或者,最终,最简单的可能是它返回实体,并将SP结果转换为User结果,作为最后的手段。 / p>

HTH。

答案 1 :(得分:0)

您必须为SP创建复杂类型,而不是使用分部类。

答案 2 :(得分:0)

非常老的线程,但今天我遇到了这个确切的问题。

一个区别是我没有将SP导入dbContext,而是选择使用SQLQuery返回Contact实体的列表。

var allContacts = _dbContext.Database.SqlQuery<Contacts> 
("CRM.GetAllContactsForCustomer @customerID, param1).ToList();

像TS一样,我创建了一个局部类来容纳SP会返回的额外属性。

public partial class Contacts
{
    public EnumContactOrigin ContactOrigin { get; set; }
}

执行SP时不会填充此属性,与在dbContext中导入SP时一样。

出于某种原因,我想到了为联系人创建包装类以保存该额外属性的想法。

public class ExtendedContacts : Contacts
{
    public new EnumContactOrigin ContactOrigin { get; set; }
}

猜猜是什么,它有效!现在,ContactOrigin确实可以正确填充。

var allContacts = _dbContext.Database.SqlQuery<ExtendedContacts> 
("CRM.GetAllContactsForCustomer @customerID, param1).ToList();

对于我来说,我认为它是包装类,因为我只使用联系人列表显示在网格中。

我想知道为什么为什么有效?并且如果有另一种方法可以在不需要此ExtendedContacts类的情况下将更多属性检索到Contacts中。