DbContext.Database.SqlQuery不填充实体框架额外属性

时间:2015-12-24 08:08:36

标签: c# .net entity-framework

当我使用额外的分部类向EF自动生成的类添加额外的属性时,在对数据库运行查询时,不会填充或填充这些属性。

示例:

自动生成的类人员:

public partial class Person
{
    public string Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

我自己的部分课程

public partial class Person
{
    public string DisplayName{ get; set; }
}

当我进行以下查询时:

"SELECT *, (FirstName + LastName) AS DisplayName FROM [Person]" 

并使用

DbContext.Database.SqlQuery(typePerson, SQL, null)

填充了Id,FirstName和LastName,但不填充DisplayName。

然而,当我创建一个名为MyPerson的全新类

public partial class MyPerson
{
    public string Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string DisplayName{ get; set; }
}

使用MyPerson类型运行相同的查询,同时填充DisplayName。

任何人都可以解释这个或者告诉我如何解决这个问题,这样我就可以使用Partials而不必创建新的类/类型。

下载示例:https://www.dropbox.com/s/dayrv0jzuoju9q3/StackOverflow_EF_ExtraProperties.zip?dl=0

更新2015-12-28: 在阅读其他stackoverflow和Codeproject论坛时,我找到了另一种方法来实现它:

1)使用Typebuilder(http://www.codeproject.com/Articles/206416/Use-dynamic-type-in-Entity-Framework-SqlQuery)但是由于所有类型的项目依赖性,我在查找已创建的类型而不是炸毁内存时遇到了问题;

2)目前为止的最佳选择:使用继承。

当我用这一行创建另一个类时:

class Person_Reflect : Person { }

我可以使用以下代码(它将忽略EDMX文件中的映射并使用反射:

List<EF.Person> listPerson = dbEntities.Database.SqlQuery<EF.Person_Reflect>(sql, new object[] { }).ToList<EF.Person>();

2 个答案:

答案 0 :(得分:2)

到目前为止,无需编写太多代码和/或在发生数据库更改时进行大量代码检查的最佳选项是使用继承。

当我用这一行创建另一个类时:

class Person_Reflect : Person { }

我可以使用以下代码(它将忽略EDMX文件中的映射并使用反射):

List<EF.Person> listPerson = dbEntities.Database.SqlQuery<EF.Person_Reflect>(sql, new object[] { }).ToList<EF.Person>();

答案 1 :(得分:0)

尝试删除*

@"
 SELECT 
     Id 
    ,FirstName 
    ,LastName 
    ,(FirstName + ' ' + LastName) AS DisplayName 
 FROM [Person]" 

或者你可以做到这一点就是代码......然后你就不需要把它包含在你的原始SQL中了

public string DisplayName { get { return FirstName+ " " +LastName ; } }