寻找不存在的列

时间:2013-08-14 22:00:37

标签: c# asp.net .net entity-framework

我收到消息... *无效的列名'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的答案标记为上述扩展名的答案!

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

2 个答案:

答案 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();