我有一个效果很好的实体,但后来我需要处理另一个来自另一个表的属性。我没有能力创建一个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
答案 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)
希望在表中找到这样的列。