2015-05-27 19 views
7

Ho due tabelle nel mio database, BUNTS, che contiene informazioni su pezzi di acciaioEntity Framework suggerisce il nome del campo non valido

CREATE TABLE BUNTS (
    BUNTCODE   INTEGER NOT NULL, 
    BUNTNAME   VARCHAR(20), 
    BUNTSTEEL  INTEGER, 
    ...... 
); 

e POLL_WEIGHT_BUNTS, che contiene informazioni sulle operazioni che erano state eseguite su ogni bunt

CREATE TABLE POLL_WEIGHT_BUNTS (
    PWBCODE   INTEGER NOT NULL, 
    PWBBUNTCODE  INTEGER, 
    PWBDEPARTMENTFROM INTEGER, 
    PWBDEPARTMENTTO INTEGER 
    .... 
); 

La relazione è uno-a-molti. Ho mappato quei tavoli ai modelli. Tutto ha funzionato bene. Recentemente ho deciso di aggiungere un campo alla tavola bunts che riferimento all'ultima operazione che era stata eseguita su bunt:

BUNTLASTOPER  INTEGER 

Ora i miei modelli simile a questa:

[Table("BUNTS")] 
public class Bunt 
{ 
    [Key] 
    [Column("BUNTCODE")] 
    public int? Code { set; get; } 
    [Column("BUNTNAME")] 
    public string Name { set; get; } 
    [Column("BUNTSTEEL")] 
    public int? SteelCode { set; get; } 
    [Column("BUNTLASTOPER")] 
    public int? LastOperationID { set; get; } 
    [ForeignKey("LastOperationID")] 
    public BuntOperation LastOperation { set; get; } 
    public virtual ICollection<BuntOperation> Operations { set; get; } 
} 

[Table("POLL_WEIGHT_BUNTS")] 
public class BuntOperation 
{ 
    [Key] 
    [Column("PWBCODE")] 
    public int? Code { set; get; } 
    [Column("PWBBUNTCODE")] 
    public int? BuntCode { set; get; } 
    [ForeignKey("BuntCode")] 
    public Bunt Bunt { set; get; } 
    [Column("PWBDEPARTMENTFROM")] 
    public int? DepartmentFromCode { set; get; } 
    ..... 
} 

Dopo che ho 'ho fatto questo, quando provo ad interrogare operazioni come questa

return _context.Operations; 

genera uno SQL-dichiarazione con nuovo campo Bunt_Code errato

SELECT 
"B"."PWBCODE" AS "PWBCODE", 
"B"."PWBBUNTCODE" AS "PWBBUNTCODE", 
"B"."PWBDEPARTMENTFROM" AS "PWBDEPARTMENTFROM", 
.... 
"B"."Bunt_Code" AS "Bunt_Code" 
FROM "POLL_WEIGHT_BUNTS" AS "B" 

Suppongo che ora EF cerchi un campo che è una chiave esterna per la tabella BUNTS e non può trovarlo. Quindi genera il campo Bunt_Code, che manca nel mio database. Ma ho già una proprietà Bunt nella classe BuntOperation, che fa riferimento alla tabella BUNTS. Cosa mi manca?


UPDATE sembra che questo risolva il mio problema

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<Bunt>().HasOptional(b => b.LastOperation).WithMany(); 
    modelBuilder.Entity<Bunt>().HasMany(b => b.Operations).WithRequired(op => op.Bunt); 
} 
+0

Invece di '[ForeignKey ("BuntCode")]' io forse che tu 'supponete di fare '[ForeignKey (" PWBBUNTCODE ")]' per fare riferimento al nome effettivo della colonna dell'FK, ma non ho fatto EF in un momento quindi potrebbe essere sbagliato. – AaronLS

+0

FWIW, potresti prendere in considerazione l'aggiunta di una colonna 'order' a' BuntOperation'. Questo ti dà la possibilità di recuperarli in sequenza (e riordinarli in un secondo momento se necessario), e selezionare l'ultima operazione diventa semplicemente prelevando l'ultima voce [ordinata]. (Inoltre, non dovrai preoccuparti di aggiornare 'LastOperation' nella tua UoW.) –

+0

In realtà avevo aggiunto la colonna ordine, sebbene la tabella fosse simile ad albero, facendo riferimento all'operazione precedente. Ma lo scopo del campo "lastoperation" è quello di ottenere rapidamente informazioni su dove e quale stato un pezzo di acciaio è ora. 'left join' e questo è tutto, invece di ordinare per ordine e prendere top1 record – Pallaris

risposta

0

sembra che questo risolve il mio problema

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<Bunt>().HasOptional(b => b.LastOperation).WithMany(); 
    modelBuilder.Entity<Bunt>().HasMany(b => b.Operations).WithRequired(op => op.Bunt); 
} 
Problemi correlati