gpt4 book ai didi

c# - 将导航属性映射到主表

转载 作者:行者123 更新时间:2023-11-30 15:51:32 25 4
gpt4 key购买 nike

我的 Contract 类有两个属性 TotalAmountInstallmentAmount

public class Contract
{
public int ContractId { get; set; }
public Amount TotalAmount { get; set; }
public Amount InstallmentAmount { get; set; }
//other Amounts
}

public class Amount
{
public decimal Value { get; set; }
public string Currency { get; set; }
}

是否可以配置 Entity Framework 以便它可以创建一个具有如下结构的表 Contract:

------------------------------------------------------------
| ContractId | TotalAmountValue | TotalAmountCurrency | ...
| 999 | 1000 | USD | ...
------------------------------------------------------------

最佳答案

回答您的具体问题。通过将 Amount 类映射为 owned entity type 可以实现您的要求。 .

最简单的方法是使用 [Owned] 属性:

[Owned] // <--
public class Amount
{
public decimal Value { get; set; }
public string Currency { get; set; }
}

或流畅的 API:

modelBuilder.Owned<Amount>();

默认情况下,这将创建一个有问题的表,但列名称将为 TotalAmount_ValueTotalAmount_Currency 等。如果没问题,您就完成了。

如果要删除列名中的下划线,则需要为每个 Contract.Amount 属性使用 OwnsOne 流畅的 API,然后使用 Property( ...).HasColumnName(...) 每个 Amount 属性。您可以使用 EF Core 元数据服务在循环中执行此操作,而不是手动执行此操作。例如:

modelBuilder.Entity<Contract>(builder =>
{
var amounts = builder.Metadata.GetNavigations()
.Where(n => n.ClrType == typeof(Amount));
foreach (var amount in amounts)
{
var amountBuilder = builder.OwnsOne(amount.ClrType, amount.Name);
var amountProperties = amountBuilder.OwnedEntityType.GetProperties()
.Where(p => !p.IsKey());
foreach (var property in amountProperties)
amountBuilder.Property(property.Name).HasColumnName(amount.Name + property.Name);
}
});

关于c# - 将导航属性映射到主表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57093110/

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