我收到消息... *无效的列名'PartLot_Id'*
我认为它指的是数据库中PART_LOT的ID字段。显然,这个表,没有其他人(不是很清楚,但相信我)拥有一个字段“PartLot_Id”,所以表面上这是有道理的。
当我为这个表编写相应的实体时,我想让它更加友好,所以我改变了表和字段的大小写,并在某些情况下完全重命名字段(试图区分业务问题和数据)。然而,我确实用approriate属性修饰了类和属性,这些属性应该向EF发信号通知DataStore中的实际名称。到目前为止,这对我的所有实体都有效。
[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字段名称是实体名称加上“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”实体(我将名称更改为“Lot”,因为StrategicPart.PartLot似乎是多余的),但我 将ForeignKeyAttribute分配给试图覆盖任何CodeFirst假设/约定的“PartLotId”(我对配置模型的约定问题之一)。
Ya'知道,它刚刚发生在我身上,而且我不确定这是否具有潜在的重要性,但是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 Properties添加到彼此,并删除了引用StrategicPart的任何Nav Property。因此更新的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的答案标记为上述扩展名的答案!
感谢大家的帮助。我希望这对其他人也有帮助。
答案 0 :(得分:2)
Code First使用模式[导航属性名称] _ [相关类的主键]
在数据库中创建外键可能这样做是因为您已在PartLot的某处设置了导航属性,但未定义要导航使用的PartLotID外键。
请参阅the answer here获取一些帮助
答案 1 :(得分:0)
四年半为时已晚,但我在MVC4 EF6 Code First中遇到了类似的问题。问题是我在保存到数据库时在导航属性中有数据。
解决方案是在添加并保存到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();