我收到消息... *无效的列名'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以获取一些帮助