我正在用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的映射。
我怎样才能映射这个自定义字段?
你必须为SP创建一个复杂的类型,而不是使用部分类。
尝试在模型浏览器中添加属性到用户实体。 如果在模型中定义,而不是作为一个部分类,可能会有效果......或者,最后,最简单的可能是让它返回到一个实体,并将SP结果转换为用户结果,作为最后的手段。
HTH。
很老的帖子,但我今天遇到了这个问题。
一个不同的地方是,我没有将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中。