gpt4 book ai didi

entity-framework - 没有导航属性的 EF Code First 外键

转载 作者:行者123 更新时间:2023-12-03 05:31:49 25 4
gpt4 key购买 nike

假设我有以下实体:

public class Parent
{
public int Id { get; set; }
}
public class Child
{
public int Id { get; set; }
public int ParentId { get; set; }
}

代码优先流畅的 API 语法是什么,用于强制在数据库中创建 ParentId,并使用对 Parent 表的外键约束,不需要导航属性

我知道如果我将导航属性“Parent”添加到“Child”,那么我可以执行以下操作:

modelBuilder.Entity<Child>()
.HasRequired<Parent>(c => c.Parent)
.WithMany()
.HasForeignKey(c => c.ParentId);

但在这种特殊情况下我不想要导航属性。

最佳答案

虽然这篇文章是针对Entity Framework不是Entity Framework Core ,对于想要使用 Entity Framework Core 实现相同目标的人来说可能很有用(我使用的是 V1.1.2)。

我不需要导航属性(尽管它们很好),因为我正在练习 DDD 并且我想要 ParentChild是两个独立的聚合根。我希望他们能够通过外键而不是通过特定于基础设施的 Entity Framework 相互交谈。导航属性。

您所要做的就是使用 HasOne 在一侧配置关系和WithMany无需指定导航属性(它们毕竟不存在)。

public class AppDbContext : DbContext
{
public AppDbContext(DbContextOptions<AppDbContext> options) : base(options) {}

protected override void OnModelCreating(ModelBuilder builder)
{
......

builder.Entity<Parent>(b => {
b.HasKey(p => p.Id);
b.ToTable("Parent");
});

builder.Entity<Child>(b => {
b.HasKey(c => c.Id);
b.Property(c => c.ParentId).IsRequired();

// Without referencing navigation properties (they're not there anyway)
b.HasOne<Parent>() // <---
.WithMany() // <---
.HasForeignKey(c => c.ParentId);

// Just for comparison, with navigation properties defined,
// (let's say you call it Parent in the Child class and Children
// collection in Parent class), you might have to configure them
// like:
// b.HasOne(c => c.Parent)
// .WithMany(p => p.Children)
// .HasForeignKey(c => c.ParentId);

b.ToTable("Child");
});

......
}
}

我还给出了有关如何配置实体属性的示例,但这里最重要的是 HasOne<> , WithMany()HasForeignKey() .

关于entity-framework - 没有导航属性的 EF Code First 外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20886049/

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