2015-05-27 16 views
7

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); 
} 
+0

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

+0

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

+0

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

Antwort

0

scheint, wie dies mein Problem löst

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