2015-07-05 4 views
6

Sto utilizzando Entity Framework per generare modelli da tabelle di database esistenti. Nella "Procedura guidata modello entità dati" ho scelto l'opzione "Primo codice dal database" per assegnarmi le classi POCO. Ogni classe deve riflettere una tabella di database e contiene proprietà che corrispondono alle colonne nella tabella.Il codice prima del database crea proprietà di navigazione non valide

Il problema è che quando eseguo il progetto ottengo errori relativi alle proprietà di navigazione che non esistono nel database attuale. Tesi sono tipici EF generato proprietà di navigazione:

Invalid column name 'Attribute_AttributeId' and Invalid column name 'Shift_ShiftId' 

ci sono campi reali nel database denominato come tali perché (credo) questi campi di navigazione dinamici vengono creati in fase di esecuzione:

enter image description here

Per completezza, ecco il modello per 'Driver' che sta causando questo errore. Ci sono alcune proprietà 'virtuali' che in fase di esecuzione creare una nuova classe (proxy dinamico) per creare la logica per caricare le proprietà di navigazione:

namespace IntrinsicDataLoader.Models 
{ 
    using System; 
    using System.Collections.Generic; 
    using System.ComponentModel.DataAnnotations; 
    using System.ComponentModel.DataAnnotations.Schema; 
    using System.Data.Entity.Spatial; 

    public partial class Driver 
    { 
     public Driver() 
     { 
      DriverTrackings = new HashSet<DriverTracking>(); 
      DriverVehicles = new HashSet<DriverVehicle>(); 
     } 

     public int DriverId { get; set; } 

     public Guid DriverGuid { get; set; } 

     public long ActivityLogId { get; set; } 

     [Required] 
     [StringLength(10)] 
     public string DriverNumber { get; set; } 

     public long TransportProvideId { get; set; } 

     [Required] 
     [StringLength(50)] 
     public string FirstName { get; set; } 

     [Required] 
     [StringLength(50)] 
     public string LastName { get; set; } 

     public int? ShiftPatternId { get; set; } 

     [Required] 
     [StringLength(50)] 
     public string Password { get; set; } 

     [StringLength(50)] 
     public string Status { get; set; } 

     public DateTime? LastActive { get; set; } 

     [StringLength(50)] 
     public string DriverType { get; set; } 

     [StringLength(50)] 
     public string AKA { get; set; } 

     [StringLength(500)] 
     public string HomeAddress { get; set; } 

     [StringLength(100)] 
     public string Email { get; set; } 

     [StringLength(20)] 
     public string MobilePhone { get; set; } 

     [StringLength(20)] 
     public string OtherPhone { get; set; } 

     [StringLength(10)] 
     public string Gender { get; set; } 

     [StringLength(50)] 
     public string Ethnicity { get; set; } 

     public DateTime StartDate { get; set; } 

     [Required] 
     [StringLength(50)] 
     public string Badge { get; set; } 

     public DateTime BadgeExpiry { get; set; } 

     [Required] 
     [StringLength(50)] 
     public string BadgeType { get; set; } 

     [Required] 
     [StringLength(50)] 
     public string LicenceNumber { get; set; } 

     public DateTime LicenceExpiry { get; set; } 

     public DateTime? SchoolBadgeExpiry { get; set; } 

     [StringLength(20)] 
     public string NINumber { get; set; } 

     public bool? ApplyVAT { get; set; } 

     public decimal? VATRate { get; set; } 

     public decimal? Balance { get; set; } 

     public decimal? CommissionPercentage { get; set; } 

     [StringLength(50)] 
     public string PoliceDisclosure { get; set; } 

     public DateTime? ProofOfAddressSupplied { get; set; } 

     public DateTime? AgreementSignDate { get; set; } 

     public int? PhotoId { get; set; } 

     public bool? IsActive { get; set; } 

     public bool? IsDeleted { get; set; } 

     [Column(TypeName = "date")] 
     public DateTime? DateUpdated { get; set; } 

     [Column(TypeName = "date")] 
     public DateTime? DateInserted { get; set; } 

     [StringLength(50)] 
     public string UpdatedBy { get; set; } 

     [StringLength(50)] 
     public string InsertedBy { get; set; } 

     public virtual DriverActivityLog DriverActivityLog { get; set; } 

     public virtual TransportProvider TransportProvider { get; set; } 

     public virtual ICollection<DriverTracking> DriverTrackings { get; set; } 

     public virtual ICollection<DriverVehicle> DriverVehicles { get; set; } 

     public virtual Attribute Attribute { get; set; } 

     public virtual Shift Shift { get; set; } 
    } 
} 

ci errori sono specificamente associati con le tabelle di giunzione sto usando. Capisco che poiché l'unica funzione di una tabella di giuntura è quella di creare una relazione molti-molti EF, semplicemente la converte in una relazione molti-a-molti - così la stessa tabella di giunzioni diventa trasparente - come non esiste - tuttavia l'abilità per accedere alle relazioni rimane. A supporto di ciò, non ho alcuna classe generata per 'DriverAttribute' o 'DriverShift' ma per altre tabelle correlate come 'Attributo', 'Shift', 'TransportProvider', 'DriverVehicle' ecc.

Va tutto bene ma sono bloccato con questo errore. Cosa devo fare per modificare la classe del modello per fermare l'errore. Dalla mia attuale posizione di conoscenza tutto sembra definito correttamente.

Come il problema si verifica quando si tenta di fare riferimento al modello di driver. Ecco una visione più dettagliata delle tabelle correlate - compresi quelli che non errore:

enter image description here

+0

Sembra che le proprietà FK non siano state esplicitamente denominate in "DriverTracking" e "DriverVehicle". Mostreresti anche queste lezioni? –

+0

Felice di pubblicarli anche se le relazioni DriverTracking e DriverVehicle non si lamentano. Gli errori sono specificamente correlati alle tabelle di giunzione che EF ha "trasformato" in una relazione molti-a-molti. – ChrisCurrie

+0

Ah, naturalmente, ero confuso, perché mi aspettavo di vedere "Attributes" e "Shifts" (plurale!) In "Driver" e ho copiato alla cieca i primi membri della collezione che ho trovato. Ma questo è un errore utile, perché guardando più da vicino ora rivela che 'Driver' ha * un *' Attributo' e * a * 'Shift' (singolare). Perché il generatore del modello di classe dovrebbe inferire quel tipo di associazione dal modello di dati? Non c'è nemmeno un FK diretto (??). –

risposta

0

Sembra che ti manca proprietà di navigazione:

public int ShiftId{ get; set; } 
public int AttibuteId { get; set; } 

Questi collegherà il vostro tavolo driver con quelli relazioni virtuali:

public virtual Attribute Attribute { get; set; } 
public virtual Shift Shift { get; set; } 

saluti,