实体框架导航属性不起作用?

时间:2016-05-04 14:11:54

标签: c# asp.net-mvc entity-framework

我还在学习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;
    }
}

2 个答案:

答案 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; }
}