[英]Function Mapping Stored Procedures That Return Entities With Complex Types In Entity Framework
[英]Return value mapping on Stored Procedures in Entity Framework
我正在使用 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 创建一个复杂类型,而不是使用分部类。
尝试将属性添加到模型浏览器中的 User 实体。 如果在模型中定义它可能会起作用,而不是作为部分类......或者,最后,最简单的可能是让它返回到一个实体,并将 SP 结果转换为用户结果,作为最后的手段。
哈。
很老的线程,但我今天遇到了这个确切的问题。
一个区别是我没有将 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 中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.