C# 一对零或一关系实体框架

C# 一对零或一关系实体框架,c#,entity-framework,ef-code-first,ef-fluent-api,C#,Entity Framework,Ef Code First,Ef Fluent Api,我试图使用code first/fluent api强制执行一对(零或一)表关系,预期的表如下所示 学生可能只有一个联系人(StudentContact),也可能没有 但是每个联系人(StudentContact)必须有一个学生 StudentID StudentName 1 StudentA 2 StudentB StudentContactID StudentContact StudentID 1 123456789

我试图使用code first/fluent api强制执行一对(零或一)表关系,预期的表如下所示

学生可能只有一个联系人(StudentContact),也可能没有 但是每个联系人(StudentContact)必须有一个学生

StudentID StudentName
1         StudentA
2         StudentB

StudentContactID StudentContact StudentID
1                123456789      1
2                123456789      2
我试着用

EntityName<Student>().HasOptional(x => x.StudentContact).WithRequired(l => l.Student)
EntityName().has可选(x=>x.StudentContact)。WithRequired(l=>l.Student)
但不幸的是,它并没有为StudentID列强制一个关系,这意味着StudentID列可能包含重复的值


参考:

当您配置一对一关系时,Entity Framework要求从属关系(
StudentContact
)的主键也必须是外键。实现所需目标的正确方法可能是这样,但使用数据注释:

public class Student
{
    public int Id { get; set; }
    public string Name { get; set; }

    public StudentContact StudentContact { get; set; }
}

public class StudentContact
{
    [Key, ForeignKey("Student")]
    public int StudentId { get; set; }
    public int Contact { get; set; }
    public Student Student { get; set; }
}

当您配置一对一关系时,实体框架要求依赖关系(
StudentContact
)的主键也是外键。实现所需目标的正确方法可能是这样,但使用数据注释:

public class Student
{
    public int Id { get; set; }
    public string Name { get; set; }

    public StudentContact StudentContact { get; set; }
}

public class StudentContact
{
    [Key, ForeignKey("Student")]
    public int StudentId { get; set; }
    public int Contact { get; set; }
    public Student Student { get; set; }
}


您是如何确定
StudentContact
中的
StudentId
可以有重复的值的?您是否尝试插入记录?@JenishRabadiya是的,我尝试输入具有相同studentID的记录,sql server允许记录提交。如果您使用EF 6,则可以对studentID列应用这样的唯一约束@JenishRabadiya将对此进行尝试并给出反馈您是如何确定
StudentContact
中的
StudentId
可以有重复值的?您是否尝试插入记录?@JenishRabadiya是的,我尝试输入具有相同studentID的记录,sql server允许记录提交。如果您使用EF 6,则可以对studentID列应用这样的唯一约束@JenishRabadiya将对此进行尝试并给出反馈您上面提到的示例是一对一关系,但在帖子中为一对零或一关系(显示第i列)创建表不起作用。@vincentsty否,它是一对零或一关系。octavioccl是对的。@JenishRabadiya是对的,
StudentContact
是可选的,可以在
Student
entity@JenishRabadiya正如我在文章中提到的,上面的代码如何首先生成一对零或者一个与表列相关的关系。我想在这里实现的是StudentContact上的一个自动递增主键,以及一个与student相关的附加外键列。首先,我对上述代码的初步查看将导致StudentID(student contact的主键)的值不增加,这意味着StudentContact中的主键可能是2、4、7。如果ID为1、3、5、6的学生没有一对一关系中的Contacts,则一端必须是principal,另一端必须是dependent。主体端(在您的案例中,
Student
)是将首先插入的端,并且可以在没有从属端的情况下存在。从属端(
StudentContact
)是必须插入主体后的端,因为它有主体的外键,这也是它的主键。这两个表中的PK值是相同的。上面提到的示例是一对一关系,但在文章中为一对零或一关系(显示列i)创建表是不起作用的。@vincentsty否,它是一对零或一关系。octavioccl是对的。@JenishRabadiya是对的,
StudentContact
是可选的,可以在
Student
entity@JenishRabadiya正如我在文章中提到的,上面的代码如何首先生成一对零或者一个与表列相关的关系。我想在这里实现的是StudentContact上的一个自动递增主键,以及一个与student相关的附加外键列。首先,我对上述代码的初步查看将导致StudentID(student contact的主键)的值不增加,这意味着StudentContact中的主键可能是2、4、7。如果ID为1、3、5、6的学生没有一对一关系中的Contacts,则一端必须是principal,另一端必须是dependent。主体端(在您的案例中,
Student
)是将首先插入的端,并且可以在没有从属端的情况下存在。从属端(
StudentContact
)是必须插入主体后的端,因为它有主体的外键,这也是它的主键。两个表中的PK值相同