一对零或一关系实体框架

Posted

技术标签:

【中文标题】一对零或一关系实体框架【英文标题】:One to zero or one relationship entity framework 【发布时间】:2015-05-04 04:06:32 【问题描述】:

我正在尝试使用代码优先/流利的 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)

但不幸的是,它不会强制 StudentID 列的关系为一,这意味着 StudentID 列可能包含重复值。

参考:One to zero/one relation in entity framework code first

【问题讨论】:

您如何确定StudentContact 中的StudentId 可以有重复值?你试过插入记录吗? @JenishRabadiya 是的,我尝试输入具有相同 studentID 的记录,并且 sql 服务器允许提交记录 如果您使用的是 EF 6,您可以像这样对 StudentId 列应用唯一约束。***.com/a/23155759/1505865 @JenishRabadiya 将对此进行尝试并提供反馈 【参考方案1】:

当您配置一对一关系时,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; 

【讨论】:

你上面提到的例子是一对一的关系,但是在帖子中为一对零或一对关系(显示列i)创建表是行不通的。 @vincentsty 不,这是一对零或一对一的关系。 octavioccl 是对的。 @JenishRabadiya 是对的,StudentContact 可以在Student 实体中设置 @JenishRabadiya 上面的代码如何首先生成我在帖子中提到的与表格列相关的一对零或一个关系。我打算在这里实现的是 StudentContact 上的自动增量主键以及与学生相关的附加外键列。我对上面代码的初步查看将导致 StudentID(学生联系人的主键)的非增量值,这意味着如果学生 ID 为 1、3、5、6,则 StudentContact 中的主键可能是 2、4、7没有联系 在一对一关系中,一端必须是主体,另一端必须是从属。主体端(在您的情况下为Student)是首先插入的端,并且可以在没有依赖端的情况下存在。依赖端(StudentContact)是必须插入主体之后的端,因为它具有主体的外键,也就是它的 PK。您将在两个表中具有相同的 PK 值

以上是关于一对零或一关系实体框架的主要内容,如果未能解决你的问题,请参考以下文章

在 SQL Server 中实现一对零或一关系

EF 代码优先 - 配置一对零或一关系,无需共享 PK/FK

使用 CodeFirst 的 C# 一对零或一关系

实体代码第一个零或一到零或一关系

关联映射级联操作关系维护 ---- Hibernate之一对多|多对一关系

将 sonata_type_collection 用于一对多一关系的问题