2015-05-27 14 views
7

Mam dwie tabele w mojej bazy danych, BUNTS, który zawiera informacje na temat kawałków staliEntity Framework sugerują niepoprawną nazwę pola

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

i POLL_WEIGHT_BUNTS, który zawiera informacje na temat działań, które zostały przeprowadzone na każdy bunt

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

Relacja to jeden do wielu. Zmapowałem te tabele do modeli. Wszystko działało dobrze. Ostatnio zdecydowałem się dodać pole do bunts stołowych, które odwołują się do ostatniej operacji, które zostały przeprowadzone na bunt:

BUNTLASTOPER  INTEGER 

Teraz moje modele wyglądać następująco:

[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; } 
    ..... 
} 

Po I Wcześniej dokonał tego, gdy próbuję kwerendy operacje tego

return _context.Operations; 

generuje instrukcja_sql z nowym nieprawidłowego pola Bunt_Code

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" 

Zakładam, że teraz EF szuka pola, które jest obcym kluczem dla tabeli BUNTS i nie może go znaleźć. Generuje więc pole Bunt_Code, którego brakuje w mojej bazie danych. Ale mam już właściwość Bunt w klasie BuntOperation, która odwołuje się do tabeli BUNTS. czego mi brakuje?


UPDATE Wygląda na to rozwiązuje mój 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

Zamiast '[ForeignKey ("BuntCode")]' Myślę, że ty "powinienem zrobić' [ForeignKey ("PWBBUNTCODE")] ', aby odnieść się do rzeczywistej nazwy kolumny FK, ale nie zrobiłem EF przez jakiś czas, więc może być źle. – AaronLS

+0

FWIW, możesz rozważyć dodanie kolumny 'order' do' BuntOperation'. Daje to możliwość ich pobierania w kolejności (i jeśli to konieczne, zmiany kolejności w późniejszym terminie), a wybranie ostatniej operacji staje się po prostu wybierane z ostatniego [posortowanego] wpisu. (Nie musisz się też martwić o aktualizację "LastOperation" w swojej UU). –

+0

Właściwie dodałem kolumnę z zamówieniem, chociaż tabela jest podobna do drzewa, odwołując się do poprzedniej operacji. Jednak celem pola "ostatniej operacji" jest szybkie uzyskanie informacji o tym, gdzie i który stan jest teraz kawałkiem stali. 'left join' i to wszystko, zamiast sortować według kolejności i wybierać rekord top1 – Pallaris

Odpowiedz

0

Wygląda na to rozwiązuje mój 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); 
}