Code-First生成的数据库与DbContext Model不同

时间:2013-06-07 05:52:23

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

我已经成功设置了一个简单的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)

如果有人想知道,我没有收到构建错误或运行时错误。任何见解都表示赞赏。

3 个答案:

答案 0 :(得分:2)

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);
    }
}

修改

或者,您可以将以下属性添加到R​​ecord模型中,如果你所有人都是id:

public int PlantTypeId { get; set; }

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

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

您现在也不需要添加include条评论。

答案 1 :(得分:0)

如果要显示工厂名称,可以直接使用:

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

答案 2 :(得分:0)

您正在使用主键进行显示。这就是为什么它没有显示如上所述,你可以使用显示为植物类型名称和其他领域。