我还在学习EF,而且我正在尝试学习如何将ViewModel和JOIN与多个表一起使用。研究我认为我发现它是如何做到的,但它不起作用。
我有两个表,CustomerCall和CallStatus。客户呼叫具有Status(int)字段,CallStatus将具有状态的显示名称。所以我需要将它们加在一起。
在我的研究中,我看起来需要在ViewModel中使用Navagation属性,然后使用EF的.Include。因此,我在CustomerCall.Status和CallStatus.Id之间的SQL中创建了一个FK。
这是我的课程和视图模型
[Table("CustomerCall")]
public partial class CustomerCall
{
public int Id { get; set; }
[StringLength(50)]
public string CustomerName { get; set; }
[StringLength(50)]
public string Subject { get; set; }
[Column(TypeName = "text")]
public string Comment { get; set; }
public DateTime? CallDate { get; set; }
public int? Status { get; set; }
public int? AssignedTo { get; set; }
public DateTime? CreateDate { get; set; }
}
public partial class CallStatus
{
public int Id { get; set; }
[StringLength(25)]
public string StatusName { get; set; }
}
public class CustomerCallVM
{
public int Id { get; set; }
[DisplayName("Customer Name")]
public string CustomerName { get; set; }
public string Subject { get; set; }
public string Comment { get; set; }
[DisplayName("Call Date")]
public DateTime? CallDate { get; set; }
public int? Status { get; set; }
[DisplayName("Status")]
public string StatusName { get; set; }
public int? AssignedTo { get; set; }
[DisplayName("Assigned To")]
public string AssignedToName { get; set; }
[DisplayName("Create Date")]
public DateTime? CreateDate { get; set; }
public CallStatus CallStatus { get; set; }
}
以下是我的存储库中的EF我试图使用但是我收到错误"指定的包含路径无效。 EntityType' CPPCustomerCall.ViewModels.CustomerCall'不会声明名称为' CallStatus'""
的导航属性public CustomerCallVM SelectById(int? id)
{
using (DataContext db = new DataContext())
{
db.Configuration.AutoDetectChangesEnabled = false; //no changes needed so turn off for performance.
CustomerCallVM customerCall = new CustomerCallVM();
var call = db.CustomerCalls.Include("CallStatus").Where(c => c.Id == id).FirstOrDefault();
return customerCall;
}
}
答案 0 :(得分:1)
我的ViewModel中需要一个Navagation属性
不,那不会奏效。实体框架对您的viewmodel一无所知,也不了解CustomerCall和CallStatus之间的关系。您需要实体模型CustomerCall
中的导航属性。
您还需要CallStatusVM
。
然后您可以查询您的数据库:
var customerCall = db.CustomerCalls.Include(c => c.CallStatus).Where(...).FirstOrDefault();
然后您可以将其映射到您的viewmodel:
var customerCallVM = new CustomerCallVM
{
Id = customerCall.Id,
CustomerName = customerCall.CustomerName,
// ...
CallStatus = new CallStatusVM
{
Id = customerCall.CallStatus.Id,
StatusName = customerCall.CallStatus.StatusName,
}
};
使用AutoMapper可以使后者更容易。
答案 1 :(得分:0)
您收到的错误告诉您需要导航属性。 .Include()
正在急切加载。这种加载需要将实体加载到某个东西中。那东西就是导航属性。
以下代码是您添加导航属性时CustomerCall
类需要的样子。
[Table("CustomerCall")]
public partial class CustomerCall
{
public int Id { get; set; }
[StringLength(50)]
public string CustomerName { get; set; }
[StringLength(50)]
public string Subject { get; set; }
[Column(TypeName = "text")]
public string Comment { get; set; }
public DateTime? CallDate { get; set; }
public int? Status { get; set; }
public int? AssignedTo { get; set; }
public DateTime? CreateDate { get; set; }
//This is your navigation property
[ForeignKey("Status")]
public virtual CallStatus CallStatus { get; set; }
}