MVC模型导航链接



我正在尝试做一个简单的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; }
    }

}

LogsModelDriverModel非常简单。

该站点编译没有问题,控制器是默认生成的样板文件。视图也会生成,但"编辑/删除"页面会被删除,索引中的链接引用也会被删除。

主页加载。当尝试加载/车辆/索引时,我得到以下异常:

类型"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 的文档

最新更新