【问题标题】:Code-First generated database different from DbContext ModelCode-First 生成的数据库不同于 DbContext 模型
【发布时间】:2013-06-07 05:52:22
【问题描述】:

我已经成功设置了一个简单的 MVC4 互联网应用程序,它将模型数据存储到 LocalDb v11.0 SQL 服务器上。我使用代码优先的方法生成了数据库,但是,数据库中的表字段与模型数据库上下文不同。

public class Record
{
    public int Id { get; set; }
    public string PlantLocation { get; set; }
    public Plant PlantType { get; set; }
    public string Description { get; set; }
}
public class Plant
{
    public int Id { get; set; }
    public string Name { get; set; }
}
public class RecordContext : DbContext
{
    public DbSet<Record> Records { get; set; }
    public DbSet<Plant> Plants { get; set; }
}

dbo.Records Table 
[Id]            INT            IDENTITY (1, 1) NOT NULL,
[PlantLocation] NVARCHAR (MAX) NULL,
[Description]   NVARCHAR (MAX) NULL,
**[PlantType_Id]  INT            NULL,**

当我拉出表格数据时,每个字段都正确填充,PlantType_ID 显示所选植物的 Id。

  • 如果 PlantType_ID 不在我的 RecordContext 中,我应该如何使用 PlantType_ID 在我的视图中显示植物的 ID(甚至使用此存储的数据)?

我尝试了以下方法来尝试获取 ID,但无济于事:

        @Html.DisplayFor(modelItem => item.PlantType.Id)

如果有人想知道,我不会收到构建错误或运行时错误。任何见解都值得赞赏。

【问题讨论】:

    标签: c# asp.net database-design ef-code-first


    【解决方案1】:

    virtual 添加到植物属性以允许延迟加载:

    public virtual Plant PlantType { get; set; }
    

    为避免N+1 问题,您可以指示 EF 将 PlantType 记录作为同一初始查询的一部分恢复。比如:

    var record = db.Records.Include("PlantType").First();
    

    我们有一个扩展方法可以使用 lambdas 让它变得更好:

    var record = c.Records.Include(i => i.PlantType).First();
    
    public static class Extensions
    {
        public static IQueryable<T> Include<T, TProperty>(this IQueryable<T> source, Expression<Func<T, TProperty>> path) where T : class
        {
            return System.Data.Entity.DbExtensions.Include(source, path);
        }
    }
    

    编辑

    或者,如果您所追求的只是 id,您可以将以下属性添加到 Record 模型:

    public int PlantTypeId { get; set; }
    

    您的数据库结构将基本保持不变(约束名称将更改),但现在您可以将剃刀语法更改为:

    @Html.DisplayFor(modelItem => item.PlantTypeId)
    

    您现在也不需要添加include cmets。

    【讨论】:

      【解决方案2】:

      如果要显示植物名称,可以直接使用:

      @Html.DisplayFor(modelItem => item.PlantType.Name)
      

      【讨论】:

      • 对不起,我指的是 ID。在我的数据库中,PlantType_ID =5(例如)。每当我在我的视图模型中访问 PlantType.Name 时,它​​们都是空的。 PlantType_ID 不是我的任何类的属性,但它作为记录表中的值出现在我的数据库中。这个怎么用?
      【解决方案3】:

      您正在使用主键进行显示。这就是为什么它没有像上面所说的那样显示你可以使用 display for 植物类型名称和其他字段。

      【讨论】:

      • 这是我的索引控制器:return View(db.Records.ToList());简单地做 DisplayFor(...PlantType.Id(..or Name)) 都是空的,但在数据库中我有 PlantType_ID = 4。
      • 是的,但为什么需要显示主键?
      • 我只是想访问存储在数据库中的植物,但它是“植物”类型,我如何从数据库中获取它?
      • 显示植物名称,并为任何链接或任何内容使用主键
      猜你喜欢
      • 2011-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多