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

LiQ*_*net 8 .net c# entity-framework

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

例:

自动生成的类人员:

public partial class Person
{
    public string Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我自己的部分课

public partial class Person
{
    public string DisplayName{ get; set; }
}
Run Code Online (Sandbox Code Playgroud)

当我进行以下查询时:

"SELECT *, (FirstName + LastName) AS DisplayName FROM [Person]" 
Run Code Online (Sandbox Code Playgroud)

并使用

DbContext.Database.SqlQuery(typePerson, SQL, null)
Run Code Online (Sandbox Code Playgroud)

填充了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; }
}
Run Code Online (Sandbox Code Playgroud)

并运行与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 { }
Run Code Online (Sandbox Code Playgroud)

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

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

Sea*_*kit 0

尝试删除*

@"
 SELECT 
     Id 
    ,FirstName 
    ,LastName 
    ,(FirstName + ' ' + LastName) AS DisplayName 
 FROM [Person]" 
Run Code Online (Sandbox Code Playgroud)

或者你可以这样做是代码...然后你不需要将它包含在你的原始sql中

public string DisplayName { get { return FirstName+ " " +LastName ; } }
Run Code Online (Sandbox Code Playgroud)