SqlQuery进入[NotMapped]字段?

时间:2014-08-19 19:35:23

标签: c# sql entity-framework

我有一个效果很好的实体,但后来我需要处理另一个来自另一个表的属性。我没有能力创建一个View,所以我想只添加一个[NotMapped]字段然后使用Context.Database.SqlQuery来执行我的自定义语句并返回所有正常字段和这个新字段。

换句话说就是这样:

public class Employee
{
    public int EmployeeId { get; set; }
    public string EmployeeName { get; set; }
    [NotMapped]
    public string CustomerName { get; set; }
}

public List<Employee> GetEmployees()
{
    using (MyContext context = new MyContext())
    {
        return context.Database.SqlQuery<Employee>("select E.EmployeeId, E.EmployeeName, C.CustomerName from Employee E left join Customer C on E.CustomerId = C.CustomerId").ToList();
    }
}

是的,不是最好的例子,而是最简单的方法。从我一直在阅读的所有内容来看,SqlQuery应该忽略属性,所以这应该可以工作,但我的CustomerName总是返回null(我在Management Studio中运行SQL,它有一个值,只是EF不会反序列化到我的对象中。)

我需要做些什么才能让它发挥作用?或者我可以吗? EF是否改为不允许这样做?

-shnar

3 个答案:

答案 0 :(得分:2)

使用存储过程来计算字段时,我遇到了同样的问题。我创建了一个看起来与我的实体完全一样的视图模型而没有db注释。然后在使用视图模型调用我的存储过程后,我选择进入我的实体。所以,使用上面的例子:

public class EmployeeVM
{
    public int EmployeeId { get; set; }
    public string EmployeeName { get; set; }
    public string CustomerName { get; set; }
}

然后你可以打电话:

public List<Employee> GetEmployees()
{
    using (MyContext context = new MyContext())
    {
        return context.Database.SqlQuery<EmployeeVM>("select E.EmployeeId, E.EmployeeName,
 C.CustomerName from Employee E left join Customer C on E.CustomerId = C.CustomerId")
    .Select(x=> new Employee(){
        EmployeeId = x.EmployeeId,
        EmployeeName = x.EmployeeName,
        CustomerName = x.CustomerName
        }).ToList();
    }
}

希望这有帮助。

答案 1 :(得分:0)

将以下内容添加到DbCotext。

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Query<EmployeeExtension>();
}

并使用以下命令执行查询或存储过程。

_context.Query<EmployeeExtension>().FromSql(query/storedProcedure, parameters)

答案 2 :(得分:-1)

[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public string CustomerName { get; set; }

此注释似乎可以解决问题,因为该字段由SQLQuery填充,并且即使在Db表中不存在该列,在更新过程中也不会抱怨(DbContext.SaveChanges()

而类似的注释DatabaseGenerated(DatabaseGeneratedOption.Computed)希望在表中找到这样的列。