gpt4 book ai didi

entity-framework - ReferentialConstraint 中的依赖属性映射到一对一关系上存储生成的列错误

转载 作者:行者123 更新时间:2023-12-03 07:41:05 26 4
gpt4 key购买 nike

在 EntityFramework 代码优先模型中,存在 1:1 关系:

public class Child1
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }

public string Name { get; set; }

public Child2 Child2 { get; set; }
}

public class Child2
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[ForeignKey("Child1")]
public int Id { get; set; }

public string Name { get; set; }

public Child1 Child1 { get; set; }
}

当我尝试向数据库插入一些数据时,它抛出了异常:

{"A dependent property in a ReferentialConstraint is mapped to a 
store-generated column. Column: 'Id'."}

Child2似乎无法使用自动生成的Id,如何保留此功能并同时成功建立关系?

最佳答案

这里有两个问题,最明显的一个,在异常中显示。当您定义一对一关系时,FK 也必须是 PK。在这种情况下,两个实体的 PK 和 FK 都是 Id 字段。异常中显示的问题是 FK 是数据库生成的。因此,如果您插入带有相关 Child2Child1,EF 无法设置相关 Child2 的 FK 值,因为它是数据库生成的.

第二个问题尚未出现,即一对一关系在 SQL Server 这样的数据库中只是理论上的东西。如果要插入依赖于Child2Child1,则需要先插入Child1,然后插入相关的Child2 >。没错,但是,哎呀,您还必须在插入 Child1 之前插入 Child2,因为 Child1 还依赖于 Child2 >。因此,建立纯粹的一对一关系是不可能的。

要解决这个问题,您需要做两件事:

  1. 使关系成为 1 对(0 或 1)。 IE。您必须有一个主体实体和一个可以存在或不可以存在的从属实体。这将允许您插入主体实体,而无需依赖实体,因为通过此配置,您可以在没有依赖实体的情况下插入主体。
  2. 主体 PK 可以保留为数据库生成,但您必须更改依赖实体上的 PK,使其不由数据库生成。因此,当您插入依赖实体时,PK(也是 FK)可以由 EF 自由指定。

最后,如果你想一想,一对一的关系通常是没有意义的。您可以使用一个表来保存两个表中的所有列,因为只要表 A 中存在一行,它就必须存在于表 B 中,反之亦然。因此,拥有一个表具有相同的效果。

但是,如果您仍然想使用一对一关系,EF 允许您像这样建模:

modelBuilder.Entity<Child1>()
.HasRequired(c1 => c1.Child2)
.WithRequiredPrincipal(c2 => c2.Child1);

请注意,在这种情况下,EF 抽象会小心地允许您拥有一对一的关系,即使它不能存在于数据库中。但是,有必要使用 ModelBuilder 指定此关系,因为您需要指定主体和从属方。在本例中,主体是 Child1,从属是 Child2。请注意,您仍然必须小心数据库生成值的规则。

请注意,这是在数据库中使用从 Child2Child1 的单个 FK 进行建模的,而不是从 Child1Child1 的 FK 子2。因此,在 DB 中是 (1)-to(0 或 1) 关系,如上所述

public class Child1
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)] // Leave as is
public int Id { get; set; }
...


public class Child2
{
//[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[DatabaseGenerated(DatabaseGeneratedOption.None)] // Not db-generated
//[ForeignKey("Child1")] -- specified in the model builder
public int Id { get; set; }

关于entity-framework - ReferentialConstraint 中的依赖属性映射到一对一关系上存储生成的列错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24605152/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com