我收到消息... *无效的列名'PartLot_Id'*

我想它是指数据库中PART_LOT的ID字段。显然,此表没有其他人(不是很清楚,但请相信我)拥有字段“PartLot_Id”,因此从表面上看,这是有道理的。

当我为该表编写相应的实体时,我想使其变得更加友好,因此我更改了表和字段的大小写,并在某些情况下完全重命名了这些字段(试图从数据中区分业务问题)。但是,我确实用适当的属性修饰了类和属性,这应该向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忽略了这些属性,并实现了它的约定,据我所知,它假定Key字段名称是Entity Name加“Id”。

谁能阐明为什么似乎忽略了这些属性?

更新

@kirtsen g-感谢您的回复。无论如何,我觉得我们可能在正确的轨道上,或者比我现在更靠近的地方。我将使用一些我最初排除的其他信息来更新OP,以保持帖子的整洁和尽可能的整洁。

PartLot IS被另一个实体模型上的导航属性引用,但也被正确注释(?)。
[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”实体(我将名称更改为“Lot”,因为StrategicPart.PartLot似乎是多余的),但是我确实将ForeignKeyAttribute分配给了“PartLotId”,以尝试覆盖任何CodeFirst假设/约定(我对配置模型约定的问题之一)。

是的,它只是发生在我身上,我不确定这是否可能很重要,但是StrategicPart实体以及数据库中的STRATEGIC_PART表实际上是多对多关系之间的联接。产品和PartLots。

再次感谢!

更新

@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 Properties不会影响加入实体。所以我手动做了同样的事情。忽略StrategicPart实体,我直接将两个实体中的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的答案标记为上述扩展名的答案!

谢谢大家的帮助。我希望这也会对其他人有所帮助。

最佳答案

代码优先使用模式[导航属性名称] _ [相关类的主键]在数据库中创建外键

之所以这样做,是因为您已在PartLot的某处设置了导航属性,但未定义要使用的导航的PartLotID外键。

请参阅the answer here以获取一些帮助

09-27 12:13