2013-08-19 30 views
1

中使用下劃線創建的外鍵名稱我已閱讀並理解該約定。我遵循約定,並且在大多數情況下,數據庫中的外鍵的sql列名是'ForeignKeyEntityId'。不幸的是,這並不總是一致的,我得到ForeignKeyEntity_Id作爲sql列名。爲什麼在EF

public class Step : BaseModel 
{ 
    private ObservableCollection<StepRecord> _stepRecords; 


    public Step() 
    { 
     _stepRecords = new ObservableCollection<StepRecord>(); 
    } 

    public int Id { get; set; } 

    public DateTime? StartTime { get; set; } 
    public DateTime? EndTime { get; set; } 


    public int? PassStatusTypeId; 
    public virtual PassStatusType PassStatusType 


    public int? SaveStatusTypeId; 
    public virtual SaveStatusType SaveStatusType 

    public int? StepTypeId; 
    public virtual StepType StepType { get; set; } 

    public virtual ObservableCollection<StepRecord> StepRecords { get; set; } 
} 

該類中的所有引用都使用ForeignKeyEntity_Id模式命名。這不是我所期待的。

回答

0

也許實體框架沒有公共領域的所有地圖,只有公共屬性。因此,字段PassStatusTypeId,SaveStatusTypeIdStepTypeId不會被識別爲外鍵,並且EF會根據約定創建其自己的名稱中帶有下劃線的外鍵列。你應該使用屬性,而不是:

public int? PassStatusTypeId { get; set; } 
public virtual PassStatusType PassStatusType { get; set; } 

public int? SaveStatusTypeId { get; set; } 
public virtual SaveStatusType SaveStatusType { get; set; } 

public int? StepTypeId { get; set; } 
public virtual StepType StepType { get; set; } 
+0

我也試過,以及(刪除公共領域)具有相同的結果。這可能只是EF異常,但也可能意味着我將無法使用。包括加載參考 - 這是我測試過的結果。此外,我還沒有能夠明確地設置密鑰並將其保存到數據庫中,如PassStatusTypeId = 4 – MDA

+0

@MikeAgee:當您將'PassStatusTypeId' * *定義爲屬性*時,您是否同時擁有* PassStatusTypeId和數據庫中的PassStatusType_Id列?還是隻有其中一個? – Slauma

+0

只有PassStatusType_Id。我真的開始認爲EF在分解這個課程時已經失去了方向。我創建了另一個外鍵關係,以便做一個小小的班級Mike。使用名爲MikeId的屬性,它也會在數據庫中創建一個名爲Mike_Id的列。 – MDA

0

如果你想給一個特定的名稱,以你的外鍵可以使用ForeignKey的屬性是這樣的:

[ForeignKey("MyChildEntity")] 
public int? ChildEntityId {get;set;} 
public ChildEntity MyChildEntity {get;set;} 

在這種情況下,您的數據庫將使用而不是默認的命名約定ChildEntityId名。

在你的情況下,它會是這樣的:

[ForeignKey("PassStatusType")] 
public int? PassStatusTypeId {get;set;} 
public virtual PassStatusType PassStatusType {get;set;}