gpt4 book ai didi

c# - 如何设置与 Entity Framework 的一对一或零关系并在子实体上公开外键?

转载 作者:行者123 更新时间:2023-11-30 21:56:12 25 4
gpt4 key购买 nike

我有一个一对一关系的工作配置,如下所示:

public class ParentEntity
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id { get; set; }
}

public class ChildEntity
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id { get; set; }

[Required]
public Guid ParentId { get; set; }

[ForeignKey("ParentId")]
public ParentEntity Parent { get; set; }
}

此解决方案已投入生产并且运行良好。现在,我需要能够从父实体引用子实体,所以我尝试这样做:

public class ParentEntity
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id { get; set; }

public virtual ChildEntity Child { get; set; }
}

我收到了这个错误:

System.InvalidOperationExceptionUnable to determine the principal end of an association between the types 'ChildEntity' and 'ParentEntity'. The principal end of this association must be explicitly configured using either the relationship fluent API or data annotations.

我遇到了 multiple solutions了解如何使用 Fluent API 配置原理,但没有任何东西允许我在 ParentEntity 上添加 ChildEntity 引用并维护 ParentId ChildEntity.

最佳答案

在第一个解决方案中,EF 创建了一个单向的一对多关系。为了帮助您更好地理解正在发生的事情,使用 Fluent Api 的关系配置将是:

modelBuilder.Entity<ChildEntity>()
.HasRequired(ce=>ce.Parent)
.WithMany()
.HasForeignKey(ce=>ce.ParentId);

现在,当您添加 ChildEntity 导航属性时,EF 知道您想要创建一对一关系。在一对一关系中,EF 要求依赖实体的 PK 也是关系的 FK:

public class ParentEntity
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id { get; set; }
public virtual ChildEntity Child { get; set; }
}

public class ChildEntity
{
[Key, ForeignKey("Parent")]
public Guid Id { get; set; }

public ParentEntity Parent { get; set; }
}

但我认为这不是您正在寻找的模型,因为一个 ParentEntity 可能是多个 ChildEntity 的父级,所以我认为您需要配置一对多关系:

public class ParentEntity
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id { get; set; }

public virtual ICollection<ChildEntity> Children { get; set; }
}

public class ChildEntity
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id { get; set; }

[ForeignKey("Parent")]
public Guid ParentId { get; set; }

public ParentEntity Parent { get; set; }
}

更新

如果您想创建一对一关系并且两个实体都有自己的 PK,那么您不能在依赖实体中定义 FK 属性,因为我在回答开头解释的关于一对一的限制一种关系。您需要的解决方案可能是使用这样的模型:

public class ParentEntity
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id { get; set; }
public virtual ChildEntity Child { get; set; }
}

public class ChildEntity
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id { get; set; }

public ParentEntity Parent { get; set; }
}

将此 Fluent Api 配置添加到您的上下文中,以指定谁是关系中的委托(delegate)人和依赖者,并指定您在数据库中已有的 FK 的名称(您的实体上不能有属性那个名字):

modelBuilder.Entity<ChildEntity>()
.HasRequired(sr => sr.Parent)
.WithOptional(s => s.Child)
.Map(c=>c.MapKey("Parent_Id"));

关于c# - 如何设置与 Entity Framework 的一对一或零关系并在子实体上公开外键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31678436/

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