2013-08-14 9 views
5

existieren ich die Nachricht bekommen ... * Ungültige Spaltenname ‚PartLot_Id‘ *die Suche nach Spalte, die nicht

Ich nehme an, dass es mit dem ID-Feld des PART_LOT im databse bezieht. Klar, diese Tabelle, und keine anderen (nicht so klar, aber vertrauen Sie mir) besitzen ein Feld "PartLot_Id", also auf der Oberfläche macht dies Sinn.

Wenn ich die entsprechende Entity für diese Tabelle geschrieben habe, wollte ich es etwas freundlicher machen, also ändere ich den Fall der Tabellen und Felder und benenne die Felder in einigen Fällen vollständig um (versucht, Geschäftsinteressen von Daten zu unterscheiden) . Ich habe jedoch die Klasse und Eigenschaften mit den entsprechenden Attributen versehen, die EF signalisieren sollen, was die tatsächlichen Namen im DataStore sind. Dies hat bisher bei allen meinen Entitäten funktioniert.

[Table("PART_LOT")] 
public partial class PartLot : ModelBase 
{ 
    [Key] 
    [Column("ID")] 
    public Int32 Id { get; set; } 

    [Column("LOT_IDENT")] 
    public String LotIdentity { get; set; } 

    [Column("PART_ID")] 
    public Guid? PartId { get; set; } 

    [Column("COMPANYSITE_ID")] 
    public Guid? CompanySiteId { get; set; } 



    #region Navigation Properties 

    [ForeignKey("PartId")] 
    public virtual Part Part { get; set; } 

    [ForeignKey("CompanySiteId")] 
    public virtual Company Company { get; set; } 

    public virtual ICollection<StrategicPart> StrategicParts { get; set; } 

    public virtual ICollection<Product> Products{ get; set; } 


    #endregion 
} 

Es scheint, dass EF diese Attribute ignoriert und deren Umsetzung Konvention whichis ist, wie ich es verstehe, anzunehmen, dass das Schlüsselfeld Name der Entity-Name plus „Id“ ist.

Kann jemand Licht werfen, warum es scheint, dass diese Attribute ignoriert werden?

UPDATE

@kirtsen g- Vielen Dank für Ihre Antwort. Ich fühle mich, als wären wir auf dem richtigen Weg oder irgendwo näher als wo ich jetzt sowieso bin. Ich aktualisiere das OP mit einigen zusätzlichen Informationen, die ich ursprünglich ausgeschlossen habe, um den Post sauber und so übersichtlich wie möglich zu halten.

Die PartLot wird Referenzen durch eine Navigationseigenschaft auf einem anderen Entity-Modell, aber es ist auch richtig kommentierten (?)


[Table("STRATEGIC_PART")] 
public partial class StrategicPart : ModelBase 
{ 
    [Key] 
    [Column("ID")] 
    public Int64 Id { get; set; } 

    [Column("PRODUCT_ID")] 
    public Guid ProductId { get; set; } 

    [Column("PART_LOT_ID")] 
    public Int32 PartLotId { get; set; } 

    #region Navigation Properties 

    [ForeignKey("ProductId")] 
    public virtual Product Product { get; set; } 

    [ForeignKey("PartLotId")] 
    public virtual PartLot Lot { get; set; } 

    #endregion 
} 

Die "Lot" Eigentum der StrategicPart Modell zurückkehrt eine "PartLot" -Entität (ich änderte den Namen einfach in "Lot", da StrategicPart.PartLot redundant erschien), aber ich tat das ForeignKeyAttribute der "PartLotId" zuweisen, um alle CodeFirst Annahmen/Konventionen (eine meiner Probleme mit die Konvention über das Konfigurationsmodell).

Ich weiß, es ist mir gerade aufgefallen, und ich bin mir nicht sicher, ob dies potentiell wichtig ist oder nicht, aber die StrategicPart-Entität und somit die STRATEGIC_PART-Tabelle in der Datenbank ist eigentlich ein Join für ein Vielfaches -viele Beziehung zwischen Produkten und PartLots.

Danke nochmal!

UPDATE

@kirsten_g - Danke für mich da drin hängen !! Ich habe die Produktklasse wie gewünscht hinzugefügt.

[Table("PRODUCT")] 
public partial class Product : ModelBase 
{ 
    [Key] 
    [Column("ID")] 
    public Guid Id { get; set; } 

    [Column("MFG_INFO_ID")] 
    public Guid? ManufacturerInfoId { get; set; } 

    [Column("MODEL_ID")] 
    public Guid ModelId { get; set; } 

    [Column("MODEL_CODE")] 
    public String ModelCode { get; set; } 

    [Column("CONFIG_CODE")] 
    public String ConfigCode { get; set; } 

    [Column("SERIAL_NUMBER")] 
    public String SerialNumber { get; set; } 

    [Column("FULL_SN")] 
    public String FullSerialNumber { get; set; } 

    [Column("SW_VERSION")] 
    public String SoftwareVersion { get; set; } 

    [Column("REWORKED")] 
    public Boolean IsReworked { get; set; } 

    [Column("DATAFILE_ID")] 
    public Int32 DatafileId { get; set; } 

    [Column("SILICON_ID")] 
    public Guid? SiliconId { get; set; } 

    [Column("IS_PART_EXCEPTION_CALCULATED")] 
    public Boolean? IsPartExceptionCalculated { get; set; } 

    [Column("STATUS")] 
    public String Status { get; set; } 

    [Column("STATUS_CHANGED_DT")] 
    public DateTime StatusChangeDate { get; set; } 




    #region Navigation Properties 

    [ForeignKey("ModelId")] 
    public virtual ProductModel Model { get; set; } 

    #endregion 

} 

UPDATE: SOLUTION

dachte ich, das Problem dank heraus kirsten_g. Als ich nach der Product-Klasse gefragt habe, ist mir aufgefallen, dass ich keinen Verweis auf die Entität STRATEGIC_PART (StrategicPart) darin hinzugefügt habe. Als ich es hinzufügte, half es nicht, aber dann erinnerte ich mich ... STRATEGIC_PART's einziger Zweck ist es, eine Viele-zu-Viele-Verbindung zu ermöglichen.

Wenn ich EF verlassen hätte, um die Modelle selbst zu erstellen, würde Nav Properties für die beitretende Entität nicht stören. Also habe ich manuell dasselbe gemacht. Wenn ich die Entität StrategicPart ignoriere, habe ich Nav Properties aus den beiden Entitäten direkt einander hinzugefügt und jede Nav Property, die auf StrategicPart verweist, gelöscht. So ist die aktualisierte Produkt- und PartLot Klassen aussehen ...

[Table("PRODUCT")] 
public partial class Product : ModelBase 
{ 
    [Key] 
    [Column("ID")] 
    public Guid Id { get; set; } 

    // Removed properties for clarity. Still contatins all the properties defined above. 

    #region Navigation Properties 

    [ForeignKey("ModelId")] 
    public virtual ProductModel Model { get; set; } 

    // Added Nav Property to PartLots 
    public virtual ICollection<PartLot> PartLots{ get; set; } 

    #endregion 

} 

[Table("PART_LOT")] 
public partial class PartLot : ModelBase 
{ 
    [Key] 
    [Column("ID")] 
    public Int32 Id { get; set; } 

    // Removed properties for clarity. Still contatins all the properties defined above. 

    #region Navigation Properties 

    [ForeignKey("PartId")] 
    public virtual Part Part { get; set; } 

    [ForeignKey("CompanySiteId")] 
    public virtual Company Company { get; set; } 

    // Remove Nav Property to StrategicPart 
    // public virtual ICollection<StrategicPart> StrategicParts { get; set; } 

    public virtual ICollection<Product> Products{ get; set; } 


    #endregion 
} 

Jetzt verweisen meine Einheiten einander richtig und meine Fehler ist verschwunden! Ich habe Kirsten_gs Antwort als Antwort mit der obigen Erweiterung markiert!

Danke für die Hilfe aller. Ich hoffe, dass dies auch anderen hilft.

+0

'PartLot' eine partielle Klasse ist. Hast du gesehen, ob die Klasse wo anders definiert ist? Was ist Modelbase? –

+0

@ P.Brian.Mackey - Ich freue mich über Ihr Feedback. PartLot wird hauptsächlich als Teilklasse für zukünftige Erweiterbarkeit geschrieben, ist aber derzeit die einzige Definition von PartLot. ModelBase ist eine Basisklasse, die Eigenschaften definiert, die den meisten Entitäten gemeinsam sind (LastUpdatedDate, LastUPdateBy usw.). In der ModelBase gibt es keinen Verweis auf PartLot. –

Antwort

2

-Code Zunächst erstellt einen Fremdschlüssel in der Datenbank mit dem Muster [Namen der Navigationseigenschaft] _ [Primary Key der verwandten Klasse] mit

Es tut dies wahrscheinlich, weil Sie eine Navigationseigenschaft irgendwo PartLot eingerichtet haben , aber keinen PartLotID-Fremdschlüssel für die Navigation definiert.

Siehe the answer here für einige Hilfe

+0

Vielen Dank für Ihre Antwort. Ich habe das OP mit zusätzlichen Informationen aktualisiert. –

+0

können Sie Ihre Produktklasse veröffentlichen. –

0

Viereinhalb Jahre zu spät, aber ich hatte ein ähnliches Problem in MVC4 EF6-Code Ersten. Das Problem war, dass ich beim Speichern in der Datenbank Daten in meinen Navigationseigenschaften hatte.

Die Lösung ist einfach null aus Ihrer Navigationseigenschaft vor dem Hinzufügen und Speicher auf Ihre DbContext():

// navigation properties must be wiped out, or EF will try to link FKs 
dailyEvaluationReport.competencies = null; 
dailyEvaluationReport.trainer = null; 

// insert to database 
DailyEvaluationReport newReport = db.DailyEvaluationReport.Add(dailyEvaluationReport); 
db.SaveChanges(); 
Verwandte Themen