2013-08-19 32 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;}