Entity Framework中存储过程的返回值映射

问题描述 投票:1回答:3

我正在用EntityFramework调用一个存储过程,但我在部分实体类中设置的自定义属性为空。但我在部分实体类中设置的自定义属性是空的。我在我的edmx中有实体(我调用了edmx,我不知道该怎么称呼这个)。例如,我在数据库中有一个 "User "表,所以我在实体上有一个 "User "类,我有一个名为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的Mapping Detail窗口,在这个窗口中没有一个映射。我想添加,但窗口是只读,我不能映射它。我看了edmx的源头,没有找到任何关于SP的映射。

我怎样才能映射这个自定义字段?

c# stored-procedures entity-framework-4 mapping
3个回答
0
投票

你必须为SP创建一个复杂的类型,而不是使用部分类。


0
投票

尝试在模型浏览器中添加属性到用户实体。 如果在模型中定义,而不是作为一个部分类,可能会有效果......或者,最后,最简单的可能是让它返回到一个实体,并将SP结果转换为用户结果,作为最后的手段。

HTH。


0
投票

很老的帖子,但我今天遇到了这个问题。

一个不同的地方是,我没有将SP导入dbContext,而是选择使用SQLQuery来返回联系人实体的列表。

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时一样。

出于某种原因,我想到了为Contacts创建一个包装类来保存这个额外的属性。

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

你猜怎么着,它成功了 ContactOrigin现在被正确填写了。

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

在我的例子中,我不介意它是一个包装类,因为我只用联系人列表来显示在网格中。

我很想知道 何以 这能用吗?如果有其他方法可以在不需要这个ExtendedContacts类的情况下将额外的属性检索到Contacts中。

© www.soinside.com 2019 - 2024. All rights reserved.