2013-08-14 47 views
5

Tôi nhận được thông báo ... * Tên cột không hợp lệ 'PartLot_Id' *Looking for Cột rằng không tồn tại

Tôi cho rằng nó là đề cập đến trường ID của PART_LOT trong databse. Rõ ràng bảng này, và không có người khác (không rõ ràng nhưng tin tưởng tôi) có một lĩnh vực "PartLot_Id" do đó trên bề mặt này có ý nghĩa.

Khi tôi viết thực thể tương ứng cho bảng này, tôi muốn làm cho nó thân thiện hơn một chút vì vậy tôi đã thay đổi trường hợp bảng và trường, và trong một số trường hợp đổi tên hoàn toàn (cố phân biệt mối quan tâm kinh doanh với dữ liệu) . Tôi đã làm, tuy nhiên trang trí các lớp học và tài sản với các thuộc tính approriate đó là nghĩa vụ phải báo hiệu cho EF những gì các tên thực tế đang có trong DataStore. Điều này đã làm việc trên tất cả các thực thể của tôi cho đến bây giờ.

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

Có vẻ như EF bỏ qua các thuộc tính này và thực thi quy ước của nó, như tôi hiểu, giả sử rằng tên trường khóa là Tên thực thể cộng với "Id".

Có ai có thể làm sáng tỏ vì sao dường như các thuộc tính này bị bỏ qua?

CẬP NHẬT

@kirtsen Cảm ơn g- trả lời của bạn. Tôi cảm thấy như chúng tôi có thể đang đi đúng hướng hoặc một nơi nào đó gần gũi hơn bất cứ nơi nào Iam. Tôi đang cập nhật OP với một số thông tin bổ sung mà tôi đã loại trừ ban đầu trong nỗ lực giữ cho bài đăng sạch sẽ và gọn gàng nhất có thể.

Các PartLot LÀ là tài liệu tham khảo bằng một tài sản chuyển hướng về một mô hình tổ chức nào, nhưng nó cũng được chú thích một cách chính xác (?)


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

Các "lô" tài sản của lợi nhuận mô hình StrategicPart một thực thể "PartLot" (tôi đã đổi tên thành "Lot" là StrategicPart.PartLot có vẻ dư thừa), nhưng tôi đã làm gán ForeignKeyAttribute cho "PartLotId" trong nỗ lực ghi đè bất kỳ giả định/quy ước CodeFirst nào (một trong số của tôi) có vấn đề với quy ước trên mô hình cấu hình). Bạn biết đấy, nó chỉ xảy ra với tôi, và tôi không chắc liệu điều này có tiềm năng quan trọng hay không, nhưng thực thể StrategicPart, và do đó bảng STRATEGIC_PART trong cơ sở dữ liệu, thực sự là một sự tham gia cho nhiều người -many mối quan hệ giữa Sản phẩm và PartLots.

Cảm ơn bạn lần nữa!

CẬP NHẬT

@kirsten_g - Cảm ơn bạn treo ở đó với tôi !! Tôi đã thêm lớp Sản phẩm theo yêu cầu.

[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 

} 

UPDATE: GIẢI PHÁP

tôi đã tìm ra vấn đề nhờ kirsten_g. Bằng cách yêu cầu xem lớp Sản phẩm, điều đó xảy ra với tôi rằng tôi đã không thêm tham chiếu đến thực thể STRATEGIC_PART (StrategicPart) trong đó. Khi tôi thêm nó, nó đã không giúp đỡ nhưng sau đó tôi nhớ ... Mục đích duy nhất của STRATEGIC_PART là tạo điều kiện thuận lợi cho việc tham gia nhiều người.

Nếu tôi đã rời EF để tạo ra các mô hình, nó sẽ không làm phiền với Thuộc tính Nav cho thực thể tham gia. Vì vậy, tôi tự làm như vậy. Bỏ qua thực thể StrategicPart tôi đã thêm Thuộc tính điều hướng từ hai thực thể trực tiếp với nhau và loại bỏ bất kỳ tham chiếu Thuộc tính điều hướng chiến lược nào. Vì vậy, các lớp Sản phẩm và PartLot được cập nhật trông giống như ...

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

Bây giờ các thực thể của tôi tham chiếu lẫn nhau và lỗi của tôi đã biến mất! Tôi đã đánh dấu câu trả lời của Kirsten_g là câu trả lời với phần mở rộng ở trên!

Cảm ơn sự giúp đỡ của mọi người. Tôi hy vọng rằng điều này sẽ giúp người khác là tốt.

+0

'PartLot' là một lớp học phần. Bạn có thấy lớp học có định nghĩa hơn ở nơi khác không? Ngoài ra, modelbase là gì? –

+0

@ P.Brian.Mackey - Tôi đánh giá cao phản hồi của bạn. PartLot được viết dưới dạng một phần lớp chủ yếu cho khả năng mở rộng trong tương lai nhưng nó hiện là định nghĩa duy nhất của PartLot. ModelBase là một lớp cơ sở định nghĩa các thuộc tính phổ biến trên hầu hết các thực thể (LastUpdatedDate, LastUPdateBy, vv). Không có tham chiếu đến PartLot trong ModelBase. –

Trả lời

2

Mã đầu tiên tạo ra một chìa khóa nước ngoài trong cơ sở dữ liệu bằng cách sử dụng mô hình [Tên của tài sản chuyển hướng] _ [Primary Key của lớp liên quan]

Nó có thể được làm điều này vì bạn đã thiết lập một tài sản chuyển hướng nơi nào đó để PartLot , nhưng không được định nghĩa khóa ngoài PartLotID để điều hướng sử dụng.

Xem the answer here đối với một số sự giúp đỡ năm

+0

Cảm ơn bạn đã phản hồi. Tôi đã cập nhật OP với thông tin bổ sung. –

+0

bạn có thể đăng lớp sản phẩm của mình không. –

0

Bốn rưỡi quá muộn, nhưng tôi đã có một vấn đề tương tự trong MVC4 EF6 Mã đầu tiên. Vấn đề là tôi có dữ liệu trong thuộc tính điều hướng của mình khi lưu vào cơ sở dữ liệu.

Giải pháp là chỉ đơn giản là rỗng ra tính chất điều hướng của bạn trước khi thêm và tiết kiệm để DbContext của bạn():

// 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(); 
Các vấn đề liên quan