视图中的设置查询,导航属性(代码优先)(实体框架6 + MVC 5)

时间:2014-10-14 22:02:13

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

我想要实现的目标非常简单。首先通过代码,我希望允许用户拥有一系列联系人。他们每个人都有以下选择:"无","尚未遇到","客户"。我正在寻找的是将所选的选项添加到数据库并检索其值。

问题是我不太清楚如何正确设置关系。或者我不知道我执行的查询是否实际上正在管理关系。

我追求的方法很简单:我创建了一个下拉列表(基于字典),它从" ExposureResult"中检索数据。 table(我之前提到的选项所在的表:None,No encounter yet,Client),并在Contacts创建表单中向用户显示。

提交后,它会从" ExposureResult"中提供行的ID。 table,我会将它插入到ExposureResultID(这是我认为我设置为关系的属性),所以我可以稍后调用它。

稍后我执行以下查询:

 var query = from c in dbs.ContactsDB where c.IboID == uid select c;
        return query;

其中dbs.ContactsDB是Contacts模型的DB Context我已经实现并检索了我所照顾的所有值。

查询变量将返回IEnumerable中的模型。

然后,在.cshtml文件中我会这样称呼它:

@foreach(模型中的var项目){

item.ExposureResult }

但是它不会给我带来我期待的结果,这会得到ID值在ExposureResult中引用的内容,而不是ID本身。

这是模特

该模型如下:

    public class Contacts
{
    [HiddenInput(DisplayValue=false)]
    [Key]
    public int ContactsID { get; set; }
    [HiddenInput(DisplayValue=false)]
    public int IboID { get; set; }
    public string Name { get; set; }

    [Display(Name="First Time Met")]
    [DataType(DataType.Date)]
    [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
    public string FirstMeet { get; set; }
    public string Phone { get; set; }

    [Display(Name="Date of Contact")]
    [DataType(DataType.Date)]
    [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
    public DateTime? DateOfContact { get; set; }

    public string Comments{ get; set; }

    [Display(Name="Next Exposure")]
    [DataType(DataType.Date)]
    [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
    public DateTime? NextExposure { get; set; }

    [DataType(DataType.Date)]
    [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
    [Display(Name = "Next Exposure 2")]
    public DateTime? NextExposure2 { get; set; }

    //This is analogue to SelectedQ from Ibo Model
    //The main purpose is to receive the incoming data from the SelectList
    [NotMapped]
    public string SelectedResult { set; get; }

    [Display(Name = "Result")]
    public int ExposureResultID { get; set; }
    public virtual ICollection<ExposureResults> ExposureResult {get; set;}
    //public virtual ICollection<ExposureResults> ExposureResults { get; set; }
    public virtual ICollection<Ibo> Ibo { get; set; }
}

public class ExposureResults
{
    public int ID { get; set; }
    public string ExposureResult { get; set; }
 }

我正在制作一张图片,以便更好地解释我想要实现的目标: What I"m trying to achieve

2 个答案:

答案 0 :(得分:0)

如果我真的明白你的意思,你需要包括&#34; ExposureResult&#34;查询的属性,并将外键属性添加到ExposureResults类。

//include
dbs.ContactsDB.Include("ExposureResult") or dbs.ContactsDB.Include(er => er.ExposureResult)

public class ExposureResults {
    public int ID { get; set; }
    public string ExposureResult { get; set; }
    //foreign key property
    public int ContactsID
}

有关详细信息,请参阅此article

我希望有所帮助!

答案 1 :(得分:0)

我设法做到了。我也在ASP.NET论坛中发布了这个问题和答案:

http://forums.asp.net/p/2014225/5798579.aspx?p=True&t=635498275668626346&pagenum=1

这就是:

enter image description here

首先,我将创建一个int属性,无论我想要什么名字。在这种情况下,为了保持一致性,我决定创建以下属性:

 public int ExposureResultID { get; set; }

此属性将是具有ExposureResult表/模型的引用行的外键。但这还不够。实体框架不会通过魔法知道这实际上是外键。

然后我们添加以下属性:

[ForeignKey("ExposureResultID")]
        public virtual ExposureResult ExposureResult { get; set; }

正如您所看到的,我添加了&#34; ExposureResult&#34; type,表示将具有我想要引用的数据的表/ model / class(外表)。

请注意我已经加下划线并加粗了&#34;虚拟&#34;关键词。说得这么做是必要的。这将允许延迟加载工作。

然后,如您所见,它具有Data Annotation属性&#34; Foreign Key&#34;。这是您告诉Entity Framework谁是外键的地方。在我的例子中,我声明的属性是:ExposureResultID:

enter image description here

然后,将模型传递给视图,并运行foreach循环:

@foreach (var item in Model) {
     @Html.DisplayFor(modelItem => item.ExposureResult.ExposureResults)

}

这将使延迟加载工作!