Varlık veritabanı tablolarından modeller oluşturmak için Entity Framework kullanıyorum. 'Varlık Veri Modeli Sihirbazı'nda' POCO sınıflarını bana vermek için 'Veritabanından İlk Kod' seçeneğini seçtim. Her bir sınıf bir veritabanı tablosunu yansıtmalı ve tablodaki sütunlara karşılık gelen özellikleri içerir.Kod İlk Veritabanından geçersiz olan gezinme özelliklerini oluşturur.
Projeyi çalıştırdığımda, gerçek veritabanında bulunmayan gezinme özellikleriyle ilgili hatalar alıyorum. Tezler tipik EF üretilen navigasyon özellikleri şunlardır:
Invalid column name 'Attribute_AttributeId' and Invalid column name 'Shift_ShiftId'
(sanırım) bu dinamik navigasyon alanları zamanında oluşturulan çünkü bu adın veritabanında hiçbir gerçek alan vardır: For
Tamlık, bu hataya neden olan 'Sürücü' için model.
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; }
}
}
There hataları özellikle kullanıyorum kavşak tabloları ile ilişkilidir: zamanında navigasyon özelliklerini yüklemek için mantığı oluşturmak için yeni bir sınıf (dinamik vekil) oluşturmak epeyce 'sanal' özellikler vardır. Bir kavşak tablosunun tek işlevi birçok ilişkiyi bir çok ilişkiyi oluşturmak olduğu için, bunu çoktan çoğa bir ilişkiye dönüştürdüğünü anlıyorum - bu nedenle bağlantı tablosu kendiliğinden şeffaflaşır - var olmadığı gibi - yine de ilişkilere erişmek için kalır. Bunu desteklemek için 'DriverAttribute' veya 'DriverShift' için üretilmiş herhangi bir sınıfım yok, ancak 'Attribute', 'Shift', 'TransportProvider', 'DriverVehicle' vb. Ilgili diğer tablolar için de yap.
Her şey yolunda ama bu hata ile sıkışıp kaldım. Hatayı durdurmak için model sınıfını değiştirmem gerekenler. Şu anki bilgi konumumdan her şey doğru tanımlanmış gibi görünüyor.
Sürücü modeline başvurmaya çalıştığımda sorun ortaya çıkıyor. İşte ilişkili tabloların daha ayrıntılı görünüşü var - hata olmayanları da dahil:
FK özellikleri açıkça "DriverTracking" ve "DriverVehicle" olarak adlandırılmadı gibi görünüyor. Bu sınıfları da gösterir misiniz? –
DriverTracking ve DriverVehicle ilişkilerini şikayet etmese de onları göndermek için mutluyuz. Hatalar, EF'in çoktan çoğa bir ilişkiye “dönüştürdüğü” bağlantı tabloları ile ilgilidir. – ChrisCurrie
Tabii ki kafam karıştı, çünkü 'Sürücü'de' Nitelikler 've' Shiftler'i (çoğul!) Görmeyi bekledim ve bulduğum ilk koleksiyon üyelerini körü körüne kopyaladım. Ama bu çok kullanışlı bir hatadır, çünkü şimdi daha yakından bakmak “Sürücü” nin * a * 'Attribute” ve * a * 'Shift' (tekil) olduğunu ortaya çıkarmaktadır. Neden sınıf model jeneratörü, veri modelinden bu tür bir ilişkilendirme türü çıkardı? Doğrudan FK (??) bile yoktur. –