2015-02-18 5 views
1

Я пытаюсь сделать простой проект MVC. Идея состоит в том, чтобы выбрать информацию из базы данных и отобразить ее на карте. Это обновление/замена предыдущего задания, не записанного в MVC. Желательны новые функции, которые MVC должен упростить (для поддержания).MVC Model Navigation Links

База данных - это база данных поставщика, и я не могу вносить никаких изменений. Я добавил 4 просмотры:

  • vwMapsDrivers Водитель Детали
  • vwMapsVehicles Подробности об автомобиле
  • 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; } 
    } 
} 

Это VehicleModel

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 довольно просты.

Сайт компилируется без проблем, при этом Контроллеры являются стандартными шаблонами. Представления также генерируются, но удаляются страницы «Редактировать/Удалить», а также ссылки на ссылки в Индексе.

Главная страница загружается. При попытке загрузить/Vehicle/Индекс Я получаю следующее исключение:

ForeignKeyAttribute на свойстве «NodeId» на тип «CtrackMapsMVC.Models.IncidentModel» не является допустимым. Свойство навигации «Транспортные средства» не было найдено на зависимом типе «CtrackMapsMVC.Models.IncidentModel». Значение Name должно быть допустимым именем свойства навигации.

Что я делаю неправильно с моей декларацией внешнего ключа? Как я могу это исправить? Некоторое чтение подразумевает, что это не сработает, потому что SQL VIews фактически не имеет отношений FK (невозможно определить). Есть ли расширение, которое поможет? Конечно, кодирование против представлений не так уж необычно?

ответ

0

Недвижимость, которую вы здесь установили: [ForeignKey("Vehicles")] - это ваш навигационный объект, который вы выбрали для Транспортные средства, но вы включили public virtual VehicleModel Vehicle { get; set; }, который является Автомобилем, а не транспортным средством.

Ref: http://peterkellner.net/2012/04/07/gaining-some-control-back-from-microsofts-entity-framework-code-first-name-your-own-foreign-keys/

+0

Таким образом, потому что я указать 3 свойства вниз нижней 'общественной виртуальной VehicleModel Vehicle {получить; задавать; } ' ' public virtual DriverModel Driver {get; задавать; } ' ' public virtual ICollection Журналы {get; задавать; } ' Мне не нужна ссылка FOreignKey? – Hecatonchires

+0

Изменение аннотации ForeignKey к '[ForeignKey (« Vehicle »)]' просто привело к другому исключению ** {«Невозможно определить составной внешний ключ для внешнего ключа по типу CtrackMapsMVC.Models.IncidentModel. При использовании данных ForeignKey аннотация по составным свойствам внешнего ключа гарантирует, что порядок задается с помощью аннотации данных столбца или свободного API. »} ** Это интересно, потому что я не думаю, что у меня есть составной ключ. Если не считать его FirstLogId и LastLogId, которые должны быть двумя отдельными ссылками. – Hecatonchires

+0

Скорее всего, ваша модель журналов. См. Https://msdn.microsoft.com/en-us/data/jj591583#relationships –

0

Здесь 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] атрибуты по от вашей модели.

Good Luck ...

Docs for EntityTypeConfiguration