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