我正在尝试做一个简单的MVC项目。这个想法是从数据库中选择信息并将其显示在地图上。这是对以前未使用MVC编写的作业的升级/替换。MVC应该使新特性变得容易(易于维护)。
该数据库是一个供应商数据库,我不能做任何更改。我添加了4个视图:
- vwMapsDrivers驱动程序详细信息
- vwMaps车辆详细信息
- vwMapsIncidents事件详细信息
- vwMapsLogs日志条目
基本计划是列出事件,附带驾驶员和车辆信息,以及从事件开始到事件结束的日志集合(无论哪种方式都是一个阈值)。
这是MainContext类
using System;
using System.Data.Entity;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
namespace MapsMVC.Models
{
public class MainContext : DbContext
{
public DbSet<VehicleModel> Vehicles { get; set; }
public DbSet<IncidentModel> Incidents { get; set; }
public DbSet<DriverModel> Drivers { get; set; }
public DbSet<LogsModel> Logs { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<VehicleModel>().ToTable("vwMapsVehicles");
modelBuilder.Entity<IncidentModel>().ToTable("vwMapsIncidents");
modelBuilder.Entity<DriverModel>().ToTable("vwMapsDrivers");
modelBuilder.Entity<LogsModel>().ToTable("vwMapsLogs");
base.OnModelCreating(modelBuilder);
}
}
}
这是IncidentModel类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.Entity;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using DataAnnotationsExtensions;
namespace CtrackMapsMVC.Models
{
public class IncidentModel
{
[Key]
[Integer]
[Min(0)]
[Display(Name = "Incident Id")]
public int IncidentId { get; set; }
[Integer]
[ForeignKey("Vehicles")]
[Display(Name = "Vehicle Id")]
public string NodeId { get; set; }
[DataType(DataType.DateTime)]
[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd HH:mm:ss}", ApplyFormatInEditMode = true)]
[Display(Name = "Incident Start")]
public DateTime IncidentStart { get; set; }
[DataType(DataType.DateTime)]
[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd HH:mm:ss}", ApplyFormatInEditMode = true)]
[Display(Name = "Incident End")]
public DateTime IncidentEnd { get; set; }
[Required]
[DataType(DataType.Text)]
[Display(Name = "Location")]
public string Location { get; set; }
[Required]
[DataType(DataType.Text)]
[Display(Name = "Incident Type")]
public string IncidentType { get; set; }
[Integer]
[Min(0)]
[ForeignKey("Logs")]
[Display(Name = "First Log Id")]
public int FirstLogId { get; set; }
[Integer]
[Min(0)]
[ForeignKey("Logs")]
[Display(Name = "Last Log Id")]
public int LastLogId { get; set; }
[Integer]
[Min(0)]
[ForeignKey("Drivers")]
[DisplayFormat(NullDisplayText = "No Driver")]
[Display(Name = "Driver Node Id")]
public int DriverNodeId { get; set; }
public virtual VehicleModel Vehicle { get; set; }
public virtual DriverModel Driver { get; set; }
public virtual ICollection<LogsModel> Logs { get; set; }
}
}
这是车辆模型
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.Entity;
using System.ComponentModel.DataAnnotations;
using DataAnnotationsExtensions;
namespace CtrackMapsMVC.Models
{
public class VehicleModel
{
[Key]
[Integer]
[Min(0)]
[Editable(false)]
[Display(Name = "Node Id")]
public int NodeId { get; set; }
[Required]
[DataType(DataType.Text)]
[Editable(false)]
[Display(Name = "Vehicle Name")]
public string VehicleName { get; set; }
[DataType(DataType.Text)]
[Editable(false)]
[Display(Name = "Vehicle Description")]
public string VehicleDescription { get; set; }
[DataType(DataType.Text)]
[Editable(false)]
[Display(Name = "Cellnumber")]
public string Cellnumber { get; set; }
[DataType(DataType.DateTime)]
[Editable(false)]
[Display(Name = "Last Received")]
public DateTime LastReceived { get; set; }
[DataType(DataType.Text)]
[Editable(false)]
[Display(Name = "Unit Type")]
public string NodeTypeDesc { get; set; }
[DataType(DataType.Text)]
[Editable(false)]
[Display(Name = "Site Code")]
public string SiteCode { get; set; }
}
}
LogsModel和DriverModel非常简单。
该站点编译没有问题,控制器是默认生成的样板文件。视图也会生成,但"编辑/删除"页面会被删除,索引中的链接引用也会被删除。
主页加载。当尝试加载/车辆/索引时,我得到以下异常:
类型"CtrackMapsMVC.Models.IncidentModel"的属性"NodeId"的ForeignKeyAttribute无效。在依赖类型"CtrackMapsMVC.Models.IncidentModel"上找不到导航属性"Vehicles"。Name值应为有效的导航属性名称。
我的外键声明出了什么问题?我该怎么修?一些阅读暗示它不起作用,因为SQLVIews实际上没有FK关系(无法定义)。有没有延期会有帮助?当然,针对视图进行编码不是很少见吗?
您在此处设置的属性:[ForeignKey("Vehicles")]
是您的导航属性,您将其设置为"车辆",但包含了public virtual VehicleModel Vehicle { get; set; }
,它是"车辆"而不是"车辆"。
参考编号:http://peterkellner.net/2012/04/07/gaining-some-control-back-from-microsofts-entity-framework-code-first-name-your-own-foreign-keys/
这就是基于EntityTypeConfiguration<>
的映射很有用的地方。给你一些编译时的帮助:
internal class IncidentMap : EntityTypeConfiguration<IncidentModel>
{
public IncidentMap()
{
HasKey(x => x.IncidentId);
ToTable("vwMapsIncidents");
HasRequired(m => m.Vehicle)
.WithMany()
.HasForeignKey(m => m.NodeID);
//or if you added a 'Incidents' property on 'Vehicle'
HasRequired(m => m.Vehicle)
.WithMany(m => m.Incidents)
.HasForeignKey(m => m.NodeID);
}
}
用法:
public class MainContext : DbContext
{
public DbSet<VehicleModel> Vehicles { get; set; }
public DbSet<IncidentModel> Incidents { get; set; }
public DbSet<DriverModel> Drivers { get; set; }
public DbSet<LogsModel> Logs { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(new IncidentMap());
modelBuilder.Configurations.Add(new VehicleMap());
modelBuilder.Configurations.Add(new DriverMap());
modelBuilder.Configurations.Add(new LogsMap());
base.OnModelCreating(modelBuilder);
}
}
然后从模型中删除所有[ForeignKey]
属性。
祝你好运。。。
EntityTypeConfiguration 的文档