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);
}
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
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.) –
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