ich zwei Tabellen in meiner Datenbank, BUNTS
, die Informationen über Stücke aus Stahl enthältEntity Framework auf ungültigen Feldnamen
CREATE TABLE BUNTS (
BUNTCODE INTEGER NOT NULL,
BUNTNAME VARCHAR(20),
BUNTSTEEL INTEGER,
......
);
und POLL_WEIGHT_BUNTS
, die Informationen über Vorgänge enthält, die auf jedem durchgeführt worden waren bunt
CREATE TABLE POLL_WEIGHT_BUNTS (
PWBCODE INTEGER NOT NULL,
PWBBUNTCODE INTEGER,
PWBDEPARTMENTFROM INTEGER,
PWBDEPARTMENTTO INTEGER
....
);
Die Beziehung ist eins zu viele. Ich habe diese Tabellen Modellen zugeordnet. Alles hat gut funktioniert. Vor kurzem habe ich beschlossen, ein Feld zu Tabelle bunts hinzuzufügen, die auf der letzten Operation verweisen würde, die auf bunt durchgeführt worden war:
BUNTLASTOPER INTEGER
Nun sieh mal meine Modelle wie folgt aus:
[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; }
.....
}
Nachdem ich habe dies gemacht, wenn ich versuche, Operationen zur Abfrage wie diese
return _context.Operations;
es eine SQL-Anweisung mit neuem falschem Feld Bunt_Code erzeugt
Ich nehme an, dass EF jetzt nach einem Feld sucht, das ein Fremdschlüssel für BUNTS
Tabelle ist, und kann es nicht finden. So erzeugt es Feld, das in meiner Datenbank fehlt. Aber ich habe bereits eine Eigenschaft Bunt
in BuntOperation
Klasse, die auf BUNTS
Tabelle verweist. Was vermisse ich?
UPDATE wie dies scheint löst mein Problem
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);
}
Statt '[ForeignKey ("BuntCode")]' Ich denke, vielleicht haben Sie 'sollte tun '[ForeignKey (" PWBBUNTCODE ")]' um den tatsächlichen Spaltennamen des FK zu referenzieren, aber ich habe EF nicht innerhalb einer Weile gemacht, daher könnte es falsch sein. – AaronLS
FWIW, sollten Sie in Erwägung ziehen, 'BuntOperation' eine Spalte' order' hinzuzufügen. Dies gibt Ihnen die Möglichkeit, diese nacheinander abzufragen (und zu einem späteren Zeitpunkt neu anzuordnen), und wenn Sie die letzte Operation auswählen, wird einfach der letzte [sortierte] Eintrag ausgewählt. (Sie müssen sich auch nicht darum sorgen, 'LastOperation' in Ihrer UoW zu aktualisieren.) –
Eigentlich hatte ich die Order-Spalte hinzugefügt, obwohl die Tabelle baumartig ist und auf die vorherige Operation verweist. Der Zweck des "Last Operation" -Feldes ist es, schnell Informationen darüber zu erhalten, wo und in welchem Zustand sich ein Stück Stahl befindet. 'left join' und das ist es, anstatt nach Reihenfolge sortieren und top1 record – Pallaris