9

メッセージが表示されます... *無効な列名 'PartLot_Id'*

データベースのPART_LOTのIDフィールドを参照していると思います。明らかに、このテーブルと他のテーブル (それほど明確ではありませんが、私を信じてください) は「PartLot_Id」フィールドを持っていないので、表面的にはこれは理にかなっています。

このテーブルに対応するエンティティを作成したとき、もう少し使いやすくしたかったので、テーブルとフィールドの大文字と小文字を変更し、場合によってはフィールドの名前を完全に変更しました (ビジネス上の問題とデータを区別しようとしました)。ただし、DataStore 内の実際の名前を EF に通知する適切な属性でクラスとプロパティを装飾しました。これは、これまですべてのエンティティで機能していました。

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

EF はこれらの属性を無視し、その規則を実装しているようです。これは、私が理解しているように、キー フィールド名がエンティティ名と「Id」であると想定することです。

これらの属性が無視されているように見える理由を誰かが明らかにすることはできますか?

アップデート

@kirtsen g- ご返信ありがとうございます。とにかく、私たちは正しい軌道に乗っているか、今いる場所よりもどこか近くにいるように感じます. 投稿をできるだけすっきりと整理するために、最初に除外したいくつかの追加情報でOPを更新しています。

PartLot は別のエンティティ モデルのナビゲーション プロパティによって参照されていますが、正しく注釈が付けられています (?)


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

StrategicPart モデルの "Lot" プロパティは" PartLot " エンティティを返します (StrategicPart.PartLot が冗長に思えたため、名前を単純に "Lot" に変更しました)。CodeFirst の仮定/規則 (構成モデルよりも規則に関する私の問題の 1 つ)。

これが潜在的に重要かどうかはわかりませんが、StrategicPart エンティティ、つまりデータベース内の STRATEGIC_PART テーブルは、実際には多対多の関係の結合です。製品とパートロット。

再度、感謝します!

アップデート

@kirsten_g - 一緒にいてくれてありがとう!! 要求に応じて Product クラスを追加しました。

[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

}

更新:解決策

kirsten_g のおかげで問題が解決しました。Product クラスを表示するように依頼したところ、STRATEGIC_PART (StrategicPart) エンティティへの参照を追加していないことに気付きました。追加したときは役に立ちませんでしたが、思い出しました... STRATEGIC_PARTの唯一の目的は、多対多の結合を容易にすることです。

モデル自体を作成するために EF を残していた場合、結合エンティティへの Nav プロパティを気にする必要はありません。だから私は手動で同じことをしました。StrategicPart エンティティを無視して、2 つのエンティティの Nav プロパティを相互に直接追加し、StrategicPart を参照する Nav プロパティを削除しました。したがって、更新された Product クラスと PartLot クラスは次のようになります...

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

これで、エンティティが相互に適切に参照され、エラーが解消されました! 上記の拡張機能を使用して、Kirsten_g の回答を回答としてマークしました。

みんな助けてくれてありがとう。これが他の誰かにも役立つことを願っています。

4

2 に答える 2

7

Code First は、パターン [ナビゲーション プロパティの名前]_[関連するクラスの主キー] を使用して、データベースに外部キーを作成します。

これはおそらく、ナビゲーション プロパティを PartLot のどこかに設定したが、ナビゲーションが使用するための PartLotID 外部キーを定義していないためです。

ヘルプについては、こちらの回答を参照してください

于 2013-08-14T23:18:35.543 に答える
0

4 年半遅すぎましたが、MVC4 EF6 Code First でも同様の問題がありました。問題は、データベースに保存するときに、ナビゲーション プロパティにデータが含まれていたことです。

解決策は、DbContext () に追加して保存する前に、ナビゲーション プロパティを単純に null にすることです。

// 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();
于 2018-03-07T18:14:19.240 に答える