gpt4 book ai didi

c# - 将复合键与 Entity Framework Core 结合使用并将其中的一部分用作外键

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

我正在尝试制作几个具有复合键的表(下面的示例)。我已经能够使用代码优先方法实现这一点,但我希望这些复合键能够级联到子表。这个想法是,每个子实体都将具有与其父实体相同的复合键,再加上一列。

| PurchaseOrder |
| ------------- |
| Company (PK) |
| PONum (PK) |

| PuchaseOrderLine |
| ---------------- |
| Company (PK/FK) |
| PONum (PK/FK) |
| POLine (PK) |

从技术上讲,PurchaseOrder 表会做与公司表类似的事情,但这对我来说不太重要,我想如果我能够弄清楚 POLine 到 PO 的连接,我也会弄清楚这一点。

到目前为止,这是我的尝试:

// OnModelCreating method in my class that inherits IdentityDbContext<IdentityUser> 
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);

builder.Entity<Company>()
.DefaultConfigure(c => new { c.Name });

builder.Entity<PurchaseOrder>()
.DefaultConfigure(p => new { p.Company, p.PONum })
.HasMany(e => e.PurchaseOrderLines)
.WithOne(e => e.PurchaseOrder);

builder.Entity<PurchaseOrderLine>()
.DefaultConfigure(p => new { p.Company, p.PONum, p.LineNum })
.HasOne(e => e.PurchaseOrder)
.WithMany(e => e.PurchaseOrderLines);
}

// My DefaultConfigure extension method
public static EntityTypeBuilder<T> DefaultConfigure<T>(this EntityTypeBuilder<T> builder, Expression<Func<T, object>> keyExpression)
where T : AuditableEntity
{
// Rename table to the types name
builder.ToTable(typeof(T).Name.ToLower());

// Configure the keys they passed in
builder.HasKey(keyExpression);

// Configure the default alternate key
builder.HasAlternateKey(i => new { i.RowId });

// Give the builder back
return builder;
}

当我运行此迁移并更新我的数据库时,这是我的 PurchaseOrderLine 表中的内容:


| COLUMN_NAME | CONSTRAINT_NAME |
| -------------------- | -------------------------------------------------------------------------- |
| RowId | AK_PurchaseOrderLine_RowId |
| PurchaseOrderCompany | FK_PurchaseOrderLine_PurchaseOrder_PurchaseOrderCompany_PurchaseOrderPONum |
| PurchaseOrderPONum | FK_PurchaseOrderLine_PurchaseOrder_PurchaseOrderCompany_PurchaseOrderPONum |
| Company | PK_PurchaseOrderLine |
| LineNum | PK_PurchaseOrderLine |
| PONum | PK_PurchaseOrderLine |

EFCore 刚刚使用默认命名方案添加了两个新列,并没有使用我已有的列。有没有办法让 efcore 使用代码优先方法来做这样的事情?

最佳答案

回答你的具体问题

Is there anyway to get efcore to do something like this using the code first approach?

当然有。只是 conventional foreign key names显然不起作用,因此您必须显式配置 FK 属性(通过 HasForeignKey fluent API)。

例如要么

builder.Entity<PurchaseOrderLine>()
.DefaultConfigure(p => new { p.Company, p.PONum, p.LineNum })
.HasOne(e => e.PurchaseOrder)
.WithMany(e => e.PurchaseOrderLines)
.HasForeignKey(e => { e.Company, e.PONum }); // <--

builder.Entity<PurchaseOrder>()
.DefaultConfigure(p => new { p.Company, p.PONum })
.HasMany(e => e.PurchaseOrderLines)
.WithOne(e => e.PurchaseOrder)
.HasForeignKey(e => { e.Company, e.PONum }); // <--

请注意,Has/With 对表示一种相同的关系,因此最好只在一个地方执行此操作以避免配置冲突。

关于c# - 将复合键与 Entity Framework Core 结合使用并将其中的一部分用作外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61856314/

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