C# 如何在实体框架中链接表

C# 如何在实体框架中链接表,c#,asp.net,asp.net-mvc,entity-framework,C#,Asp.net,Asp.net Mvc,Entity Framework,我正在尝试使用MVC和实体框架创建一个资产跟踪系统。数据库已经存在。我有一个ComputerInventory表,其中包含一个Location字段,该字段是Location表LocationID的伪造键。我想做的是,当我输出有关库存的信息时,我不必查看LocationID,我想查看相应LocationID的Location字段 我一直在使用一些辅导,但我似乎无法改变它以满足我的需要。我认为这很常见,所以我可能遗漏了什么。这是我的电脑清单: [Table("ComputerInventory")]

我正在尝试使用MVC和实体框架创建一个资产跟踪系统。数据库已经存在。我有一个ComputerInventory表,其中包含一个Location字段,该字段是Location表LocationID的伪造键。我想做的是,当我输出有关库存的信息时,我不必查看LocationID,我想查看相应LocationID的Location字段

我一直在使用一些辅导,但我似乎无法改变它以满足我的需要。我认为这很常见,所以我可能遗漏了什么。这是我的电脑清单:

[Table("ComputerInventory")]
public class ComputerInventory
{
    [Key]
    public String AssetTag {get; set;}
    //public Int32 Location { get; set; }

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

    public Int32 PoolType { get; set; }
    public Int32 Reason { get; set; }
    public Int32 InventoryStatus { get; set; }
    public Int32 InventoryType { get; set; }
    [StringLength(500)]
    public String Comments { get; set; }
    //public String Clock { get; set; }

   // public ICollection<Location> Locations { get; set; }
}

public class AssetDBContext : DbContext
{
    public DbSet<ComputerInventory> ComputerInventory { get; set; }

    public AssetDBContext()
        : base("Name=LaptopLoaner_RW")
    {
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
        modelBuilder.Entity<ComputerInventory>().HasRequired(l => l.Location).WithMany();
    }
}
[表格(“计算机目录”)]
公共类计算机目录
{
[关键]
公共字符串AssetTag{get;set;}
//公共Int32位置{get;set;}
[外键(“位置”)]
公共虚拟位置{get;set;}
公共Int32池类型{get;set;}
公共Int32原因{get;set;}
公共Int32 InventoryStatus{get;set;}
公共Int32 InventoryType{get;set;}
[长度(500)]
公共字符串注释{get;set;}
//公共字符串时钟{get;set;}
//公共ICollection位置{get;set;}
}
公共类AssetDBContext:DbContext
{
公共数据库集计算机目录{get;set;}
公共资产bContext()
:base(“Name=laptoploanar\u RW”)
{
}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove();
modelBuilder.Entity().HasRequired(l=>l.Location).WithMany();
}
}
这是我的位置模型

[Table("Location")]
    public class Location
    {
        [Key]
        public Int32 Id { get; set; }
        //[Column(LocationName="LocationName")]
        [MaxLength(100)]
        public String LocationName { get; set; }
        [MaxLength(25)]
        public String Country { get; set; }
    }

    public class LocationDBContext : DbContext
    {
        public DbSet<Location> Locations { get; set; }

        public LocationDBContext()
            : base("Name=<name>")
        {
        }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
        }
    }
[表格(“位置”)]
公共类位置
{
[关键]
公共Int32 Id{get;set;}
//[列(LocationName=“LocationName”)]
[MaxLength(100)]
公共字符串位置名称{get;set;}
[MaxLength(25)]
公共字符串国家{get;set;}
}
公共类LocationDBContext:DbContext
{
公共数据库集位置{get;set;}
公共位置dbcontext()
:base(“Name=”)
{
}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove();
}
}
以下是我试图在视图中输出数据的位置:

@model IEnumerable<LaptopLoaner.Models.ComputerInventory>
@foreach (var item in Model) {
<tr>
    <td>
        @Html.DisplayFor(modelItem => item.AssetTag)
    </td>
    <td>
        @Html.DisplayFor(modelItem => item.InventoryStatus)
    </td>
    <td>
      @Html.DisplayFor(modelItem => item.Location.LocationName)
    </td>
    <td>
        @Html.DisplayFor(modelItem => item.PoolType)
    </td>
    <td>
        @Html.DisplayFor(modelItem => item.Reason)
    </td>
    <td>
        @Html.DisplayFor(modelItem => item.InventoryType)
    </td>
    <td>
        @Html.DisplayFor(modelItem => item.Comments)
    </td>
    <td>
        @Html.ActionLink("Edit", "Edit", new { id=item.AssetTag }) |
        @Html.ActionLink("Details", "Details", new { id=item.AssetTag }) |
        @Html.ActionLink("Delete", "Delete", new { id=item.AssetTag })
    </td>
</tr>
@model IEnumerable
@foreach(模型中的var项目){
@DisplayFor(modelItem=>item.AssetTag)
@DisplayFor(modelItem=>item.InventoryStatus)
@DisplayFor(modelItem=>item.Location.LocationName)
@DisplayFor(modelItem=>item.PoolType)
@DisplayFor(modelItem=>item.Reason)
@DisplayFor(modelItem=>item.InventoryType)
@DisplayFor(modelItem=>item.Comments)
@ActionLink(“编辑”,“编辑”,新的{id=item.AssetTag})|
@ActionLink(“详细信息”,“详细信息”,新的{id=item.AssetTag})|
@ActionLink(“删除”,“删除”,新的{id=item.AssetTag})
}


我必须更改我的计算机库存模型还是必须从视图访问位置?

尝试使用,这可以帮助您如何使用两个表的表及其字段的关系。

数据注释

[ForeignKey("LocationId")]
public virtual Location { get; set; }

我通常使用数据注释,但是我应该开始关注Fluent API的内容,并保持我的POCO没有注释

查看我关于EF中导航属性如何工作的文章。本节介绍如何使用模型生成器配置外键属性

查看我的导航属性教程。我想这就是你想要的。您在这里看到的实际错误消息或问题是什么?@Roysvork我没有收到错误消息。我得到的是LocationID的位置输出,而不是位置(字符串),看起来您可能需要更像:@Html.DisplayFor(modelItem=>item.Loc.LocationName)?啊,真不幸!不,每个数据库只需要一个(严格来说,这不是一个正确的定义,但就我们现在应该关注的问题而言)