我已经阅读并理解了这个惯例。我遵循了约定,在大多数情况下,外键的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模式命名。这不是我所期待的。
答案 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)
可能实体框架根本不映射公共字段,只映射公共属性。因此,字段PassStatusTypeId
,SaveStatusTypeId
和StepTypeId
不会被识别为外键,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; }