C# 代码首先生成不同于DbContext模型的数据库

C# 代码首先生成不同于DbContext模型的数据库,c#,asp.net,database-design,ef-code-first,C#,Asp.net,Database Design,Ef Code First,我已经成功地安装了一个简单的MVC4互联网应用程序,它将模型数据存储到LocalDb v11.0 SQL server上。我使用代码优先的方法生成了数据库,但是,数据库中的表字段与模型数据库上下文不同 public class Record { public int Id { get; set; } public string PlantLocation { get; set; } public Plant PlantType { get; set; } publ

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

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,**

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

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

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

您正在使用主键显示。这就是为什么它没有如上所述显示的原因。您可以使用display来显示plant type name和其他字段。

向plant属性添加
virtual
,以允许lazyloading:

public virtual Plant PlantType { get; set; }
为了避免出现问题,可以指示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);
    }
}
您的数据库结构基本保持不变(约束名称将更改),但现在您可以将razor语法更改为:

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

您现在也不需要添加
包含
注释。

对不起,我指的是ID。在我的数据库中,PlantType_ID=5(例如)。每当我在viewmodel中访问PlantType.Name时,它们都为空。PlantType_ID不是我的任何类的属性,但它在我的数据库中作为记录表中的值出现。这是我的索引控制器:返回视图(db.Records.ToList());简单地显示(…PlantType.Id(…或Name))都为空,但在数据库中我有PlantType_Id=4。是的,但为什么需要显示主键?我只是尝试访问存储在数据库中的植物,但它是“plant”类型,如何从数据库中获取此信息?显示工厂名称,显示任何链接或任何内容,并使用主键
public int PlantTypeId { get; set; }
@Html.DisplayFor(modelItem => item.PlantTypeId)