Code-First生成的数据库不同于DbContext模型
本文关键字:不同于 DbContext 模型 数据库 Code-First | 更新日期: 2023-09-27 18:17:16
我已经成功地设置了一个简单的MVC4互联网应用程序,将模型数据存储到LocalDb v11.0 SQL服务器上。我使用代码优先的方法生成数据库,但是,数据库中的Table字段与模型数据库上下文不同。
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)
如果有人想知道,我没有得到构建错误或运行时错误。任何见解都是值得赞赏的。
将virtual
添加到plant属性中以允许lazyloading:
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; }
你的数据库结构将基本保持不变(约束名称将改变),除了现在你可以改变你的razor语法:
@Html.DisplayFor(modelItem => item.PlantTypeId)
您现在也不需要添加include
注释
如果要显示植物名称,可以直接使用:
@Html.DisplayFor(modelItem => item.PlantType.Name)
您正在使用主键来显示。这就是为什么上面没有显示的原因,您可以使用display for显示植物类型名称和其他字段