这是我第一次尝试将EF与.include一起使用,以联接两个表。当我运行它时,我得到一个错误,即“ CallStatus_Id”是无效的列。没错,我在表中没有该字段,但是我不知道为什么EF在SQL查询中使用该字段。
我所做的是在CustomerCall表上创建了一个外键,该表将CustomerCall.Status设置为CallStatus.Id。想法是,我将PK值存储在CustomerCall.Status字段中,并将其联接到CallStutus.Id,以便获取CallStatus.StatusName用于显示。
这是我的lambda表达式:
var call = db.CustomerCalls.Include(s => s.CallStatus).Where(c => c.Id == id).FirstOrDefault();
我对lambda的理解是,它将调用CustomerCalls表,并使用创建的FK将其加入CallStatus表,WHERE语句将根据传递到存储库方法中的id提取CustomerCall的ID。
它创建以下SQL。您可以在JOIN中看到它创建了[Extent1]。[CallStatus_Id],这是不正确的。我没有该列,应该为[Extent1]。[Status],但我不知道如何更正
这些是我的EF实体类:
namespace CPPCustomerCall.Models
{
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
[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 CallStatus CallStatus { get; set; }
}
}
namespace CPPCustomerCall.Models
{
using System.ComponentModel.DataAnnotations;
public partial class CallStatus
{
public int Id { get; set; }
[StringLength(25)]
public string StatusName { get; set; }
}
}
最佳答案
通过此处发布的建议,我似乎可以通过将[ForeignKey(“ Status”)]批注添加到CustomerCall实体中的CallStatus导航属性中来使其工作。我还需要在CallStatus实体的ID字段上设置[Key]。
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; }
[ForeignKey("Status")]
public CallStatus CallStatus { get; set; }
}
public partial class CallStatus
{
[Key]
public int Id { get; set; }
[StringLength(25)]
public string StatusName { get; set; }
}