2013-08-14 12 views
5

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.

+0

'PartLot' è una classe parziale. Hai visto se la classe ha un'altra definizione altrove? Inoltre, che cos'è il modelbase? –

+0

@ 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. –

risposta

2

Codice Prima crea una chiave esterna nel database utilizzando il modello [Nome di proprietà di navigazione] _ [chiave primaria della classe correlata]

è probabilmente facendo questo perché è stata impostata una proprietà di navigazione da qualche parte per PartLot , ma non definita una chiave esterna PartLotID per la navigazione da utilizzare.

Vedere the answer here per qualche aiuto

+0

Grazie per la risposta. Ho aggiornato l'OP con ulteriori informazioni. –

+0

puoi pubblicare la tua classe di prodotto. –

0

Quattro anni e mezzo troppo tardi, ma ho avuto un problema simile in MVC4 EF6 primo codice. Il problema era che avevo dati nelle mie proprietà di navigazione durante il salvataggio nel database.

La soluzione è semplicemente nulla le vostre proprietà di navigazione prima di aggiungere e salvare al tuo DbContext():

// navigation properties must be wiped out, or EF will try to link FKs 
dailyEvaluationReport.competencies = null; 
dailyEvaluationReport.trainer = null; 

// insert to database 
DailyEvaluationReport newReport = db.DailyEvaluationReport.Add(dailyEvaluationReport); 
db.SaveChanges(); 
Problemi correlati