当我使用额外的分部类向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>();
答案 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 ; } }