我正在尝试建立一对一的关系,但是当我创建数据时,EF将外键设置为另一列。请参阅下面的课程:
public class SWAChecklist
{
public SWAChecklist()
{
this.Steps = new Steps() { SWAChecklist = this };
this.Observers = new List<Observer>();
this.PersonnelObserved = new List<PersonObserved>();
this.JobFactors = new JobFactors() { SWAChecklist = this };
this.Causes = new Causes() { SWAChecklist = this };
this.Hazards = new Hazards() { SWAChecklist = this };
}
public int ID { get; set; }
public string Status { get; set; }
public string Job { get; set; }
public Causes Causes { get; set; }
}
public class Causes
{
[Key]
public int? ID { get; set; }
public int SWAChecklistId { get; set; }
[Required]
public virtual SWAChecklist SWAChecklist { get; set; }
public bool? AdditionalHazard { get; set; }
public bool? UnsafeBehavior{ get; set; }
public bool? Planned { get; set; }
}
因此,当我尝试创建SWAChecklist.Causes时,它将核对清单的ID分配给原因列Id,而不是SWAChecklistId。 谢谢你的帮助。
答案 0 :(得分:2)
假设EF允许您在依赖方面与ID
和SWAChecklistId
建立1:0..1关系。为了避免1:多关系,EF需要SWAChecklistId
上的UNIQUE约束。然后你会得到SWAChecklistId
,一个唯一的(外来的)键列 - 这是主键的完美描述。
因此,使用与主键和外键相同的列是1:0..1关系的良好设计决策,EF正在跟随它。
如果您(出于任何原因)需要单独的外键,您可以配置1:many关系并在外键上创建唯一索引以有效地将“many”限制为0..1
答案 1 :(得分:1)
public class SWAChecklist
{
public SWAChecklist()
{
this.Steps = new Steps() { SWAChecklist = this };
this.Observers = new List<Observer>();
this.PersonnelObserved = new List<PersonObserved>();
this.JobFactors = new JobFactors() { SWAChecklist = this };
this.Causes = new Causes() { SWAChecklist = this };
this.Hazards = new Hazards() { SWAChecklist = this };
}
[Key]
public int ID { get; set; }
public string Status { get; set; }
public string Job { get; set; }
public virtual Causes Causes { get; set; }
}
public class Causes
{
[Key]
[ForeignKey("SWAChecklist")]
public int ID { get; set; }
[Required]
public bool? AdditionalHazard { get; set; }
public bool? UnsafeBehavior{ get; set; }
public bool? Planned { get; set; }
public virtual SWAChecklist SWAChecklist { get; set; }
}
你可以尝试一下