Sto ottenendo il messaggio ... * valido nome di colonna 'PartLot_Id' *ricerca di colonna che non esiste
suppongo che si riferisce al campo ID del PART_LOT nel databse. Chiaramente questo tavolo, e nessun altro (non così chiaro ma fidati di me) possiede un campo "PartLot_Id" quindi in apparenza questo ha senso.
Quando ho scritto l'entità corrispondente per questa tabella, volevo renderlo un po 'più amichevole, quindi ho cambiato il caso delle tabelle e dei campi, e in alcuni casi rinominare completamente i campi (cercando di distinguere i problemi di business dai dati) . Ho fatto, tuttavia, decorare la classe e le proprietà con gli attributi approriate che dovrebbero segnalare a EF quali sono i nomi effettivi nel DataStore. Questo ha funzionato su tutte le mie entità fino ad ora.
[Table("PART_LOT")]
public partial class PartLot : ModelBase
{
[Key]
[Column("ID")]
public Int32 Id { get; set; }
[Column("LOT_IDENT")]
public String LotIdentity { get; set; }
[Column("PART_ID")]
public Guid? PartId { get; set; }
[Column("COMPANYSITE_ID")]
public Guid? CompanySiteId { get; set; }
#region Navigation Properties
[ForeignKey("PartId")]
public virtual Part Part { get; set; }
[ForeignKey("CompanySiteId")]
public virtual Company Company { get; set; }
public virtual ICollection<StrategicPart> StrategicParts { get; set; }
public virtual ICollection<Product> Products{ get; set; }
#endregion
}
Sembra che EF sta ignorando questi attributi e l'attuazione è cheè convenzione, a quanto mi risulta, a supporre che il nome del campo chiave è il nome entità plus "Id".
Qualcuno può far luce perché sembra che questi attributi vengano ignorati?
UPDATE
@kirtsen Grazie g- per la vostra risposta. Mi sento come se potessimo essere sulla strada giusta o da qualche parte più vicino rispetto a dove Iam ora in ogni caso. Sto aggiornando l'OP con alcune informazioni aggiuntive che ho originariamente escluso nel tentativo di mantenere il post pulito e il più semplice possibile.
Il PartLot viene riferimenti da una proprietà di navigazione su un altro modello di entità, ma è anche annotato correttamente (?)
[Table("STRATEGIC_PART")]
public partial class StrategicPart : ModelBase
{
[Key]
[Column("ID")]
public Int64 Id { get; set; }
[Column("PRODUCT_ID")]
public Guid ProductId { get; set; }
[Column("PART_LOT_ID")]
public Int32 PartLotId { get; set; }
#region Navigation Properties
[ForeignKey("ProductId")]
public virtual Product Product { get; set; }
[ForeignKey("PartLotId")]
public virtual PartLot Lot { get; set; }
#endregion
}
Il "Lotto" proprietà dei rendimenti modello StrategicPart un'entità "PartLot" (ho cambiato il nome in semplicemente "Lotto" come StrategicPart.PartLot sembrava ridondante), ma I ha fatto assegnare ForeignKeyAttribute al "PartLotId" nel tentativo di sovrascrivere qualsiasi ipotesi/convenzioni CodeFirst (uno dei miei problemi con la convenzione sul modello di configurazione).
Ya 'so, mi è appena successo, e non sono sicuro se questo è potenzialmente importante o meno, ma l'entità StrategicPart, e quindi la tabella STRATEGIC_PART nel database, è in realtà un join per un numero -molte relazioni tra prodotti e PartLot.
Grazie ancora!
UPDATE
@kirsten_g - Grazie per appendere in là con me !! Ho aggiunto la classe del prodotto come richiesto.
[Table("PRODUCT")]
public partial class Product : ModelBase
{
[Key]
[Column("ID")]
public Guid Id { get; set; }
[Column("MFG_INFO_ID")]
public Guid? ManufacturerInfoId { get; set; }
[Column("MODEL_ID")]
public Guid ModelId { get; set; }
[Column("MODEL_CODE")]
public String ModelCode { get; set; }
[Column("CONFIG_CODE")]
public String ConfigCode { get; set; }
[Column("SERIAL_NUMBER")]
public String SerialNumber { get; set; }
[Column("FULL_SN")]
public String FullSerialNumber { get; set; }
[Column("SW_VERSION")]
public String SoftwareVersion { get; set; }
[Column("REWORKED")]
public Boolean IsReworked { get; set; }
[Column("DATAFILE_ID")]
public Int32 DatafileId { get; set; }
[Column("SILICON_ID")]
public Guid? SiliconId { get; set; }
[Column("IS_PART_EXCEPTION_CALCULATED")]
public Boolean? IsPartExceptionCalculated { get; set; }
[Column("STATUS")]
public String Status { get; set; }
[Column("STATUS_CHANGED_DT")]
public DateTime StatusChangeDate { get; set; }
#region Navigation Properties
[ForeignKey("ModelId")]
public virtual ProductModel Model { get; set; }
#endregion
}
UPDATE: SOLUZIONE
ho capito il problema grazie a kirsten_g. Chiedendo di vedere la classe Product mi è venuto in mente che non avevo aggiunto un riferimento all'entità STRATEGIC_PART (StrategicPart) in esso. Quando l'ho aggiunto, non è stato d'aiuto, ma poi ho ricordato ... L'unico scopo di STRATEGIC_PART è quello di facilitare un join many-to-many.
Se avessi lasciato EF per creare i modelli, non si preoccuperebbe di Nav Properties per l'entità di unione. Quindi ho fatto manualmente lo stesso. Ignorando l'entità di StrategicPart, ho aggiunto Nav Properties dalle due entità direttamente e rimosso qualsiasi StrategicPart di riferimento di proprietà di Nav. Così il prodotto aggiornato e classi PartLot assomigliano ...
[Table("PRODUCT")]
public partial class Product : ModelBase
{
[Key]
[Column("ID")]
public Guid Id { get; set; }
// Removed properties for clarity. Still contatins all the properties defined above.
#region Navigation Properties
[ForeignKey("ModelId")]
public virtual ProductModel Model { get; set; }
// Added Nav Property to PartLots
public virtual ICollection<PartLot> PartLots{ get; set; }
#endregion
}
[Table("PART_LOT")]
public partial class PartLot : ModelBase
{
[Key]
[Column("ID")]
public Int32 Id { get; set; }
// Removed properties for clarity. Still contatins all the properties defined above.
#region Navigation Properties
[ForeignKey("PartId")]
public virtual Part Part { get; set; }
[ForeignKey("CompanySiteId")]
public virtual Company Company { get; set; }
// Remove Nav Property to StrategicPart
// public virtual ICollection<StrategicPart> StrategicParts { get; set; }
public virtual ICollection<Product> Products{ get; set; }
#endregion
}
Ora i miei entità di riferimento tra loro correttamente e il mio errore è andato via! Ho contrassegnato la risposta di Kirsten_g come la risposta con l'estensione di cui sopra!
Grazie per l'aiuto di tutti. Spero che questo aiuti anche qualcun altro.
'PartLot' è una classe parziale. Hai visto se la classe ha un'altra definizione altrove? Inoltre, che cos'è il modelbase? –
@ P.Brian.Mackey - Apprezzo il tuo feedback. PartLot è scritto come una classe parziale principalmente per estensibilità futura, ma attualmente è l'unica definizione di PartLot. ModelBase è una classe base che definisce le proprietà comuni su molte Entità (LastUpdatedDate, LastUPdateBy, ecc.). Non vi è alcun riferimento a PartLot in ModelBase. –