.net - 如何在 Entity Framework 中实现真正的一对一关系?

标签 .net entity-framework-4

我快到了。我得到的越近是 1 到 0..1 的关系。

我的物理架构是:

User: 
 - Id : int primary Key identity
 - Name : varchar(50)

UserDetail: 
 - Id : int primary Key | foreign key to User.Id
 - DisplayName : varchar(200)

当我在实体数据模型设计器中导入此架构时,Visual Studio 2010 建议 1 到 0..1 的关系。如果我强制执行 1..1,它会接受,但结果看起来不像 1..1 关系。

我对 1..1 关系有什么期望?

我希望它:

  • 在我创建 UserDetail 时自动创建一个 User,反之亦然(首选)
  • 当我尝试保存没有 UserDetail 的用户时抛出异常,反之亦然

我怎样才能做到这一点?

最佳答案

它甚至在数据库级别也不被支持,因为真正的 1 对 1 关系意味着您必须具有从 UserUserDetail 的 FK,同时从 UserDetailUser。 1 到 1 表示没有第二条记录就不能存在一条记录,但这使得在检查引用约束时无法将这些记录插入到表中。

一对一实际上总是 1 到 0..1,因为您必须能够在没有从属记录的情况下插入主体记录,并且一旦主体记录被持久化,您就可以插入从属记录。 EF 与关系数据库的工作方式密切相关。我知道纯 1 对 1 有效的唯一情况是 table splitting您将实体映射到同一个表的位置,因此两个实体必须始终存在并一起插入,因为它们形成单个记录。

如果您希望始终将UserUserDetail 保存在一起,您应该使用Entity splitting 将它们建模为单个实体。 .

关于.net - 如何在 Entity Framework 中实现真正的一对一关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6242985/

相关文章:

c# - 在 winform 中打开 PDF 或 Doc

linq - 如何在 Entity Framework 中实现 select case?

c# - 对于 EF linq 查询,First(c=>cond) 是否等同于 Where(c=>cond).First()?

c# - Entity Framework 4 - 如何从存储过程读取多个记录集?

c# - 为什么枚举会这样?

c# - xml序列化同时指定xmlelement和xmlattribute

.net - 如何检测文件的使用权限 (DRM)

c# - 使用 Entity Framework 4 缓存 Linq to Entities 执行计划

asp.net-mvc-3 - 如何为由Data-First自动创建的实体添加数据注释?

c# - 为自定义 WCF 绑定(bind)指定 HTTPS