实体框架使用外键填充错误的列

时间:2017-08-10 01:49:22

标签: c# asp.net entity-framework

我正在尝试建立一对一的关系,但是当我创建数据时,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。 谢谢你的帮助。

2 个答案:

答案 0 :(得分:2)

假设EF允许您在依赖方面与IDSWAChecklistId建立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; }
}

你可以尝试一下