为什么在EF中使用下划线创建外键名称

时间:2013-08-19 14:27:19

标签: entity-framework foreign-keys

我已经阅读并理解了这个惯例。我遵循了约定,在大多数情况下,外键的sql列名是数据库中的'ForeignKeyEntityId'。不幸的是,这并不总是一致的,我将ForeignKeyEntity_Id作为sql列名。

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模式命名。这不是我所期待的。

2 个答案:

答案 0 :(得分: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;}

答案 1 :(得分:0)

可能实体框架根本不映射公共字段,只映射公共属性。因此,字段PassStatusTypeIdSaveStatusTypeIdStepTypeId不会被识别为外键,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; }