为了账号安全,请及时绑定邮箱和手机立即绑定

实体框架核心复合键一对多映射

实体框架核心复合键一对多映射

C#
喵喵时光机 2021-10-23 17:27:16
因此,在我们有两个类的映射中遇到问题public class Customer{    public int Id;    public CustomerAddress StatementAddress    public bool AlwaysTrue => true;    public string Code;}public class CustomerAddress{    public int Id;    public bool ForStatement;    public string _CustomerCode}我们有一个像这样设置的映射:protected override void OnModelCreating(ModelBuilder modelBuilder){    modelBuilder.Entity<Customer>()        .HasOne(s => s.StatementAddress)        .WithMany()        .HasPrincipalKey(x=> new {x._CustomerCode, x.ForStatement})        .HasForeignKey(s => new { s.Code, s.AlwaysTrue});}然而,这导致了一个问题,因为它似乎是在数据库上寻找 Customer 表中的 StatementAddress_CustomerCode 和 StatementAddress_ForStatement 列,这显然不是存在的东西 - 为什么它不寻找 Code 表并简单地通过 True for AlwaysTrue?我原以为它的定义键的方式只是使用代码和 Alwaystrue 值,但似乎正在寻找由属性名称的组合组成的两列,附加来自另一个类的属性名称 =/
查看完整描述

2 回答

?
繁花不似锦

TA贡献1851条经验 获得超4个赞

所以,要结束这个 -

这在 EF Core (2.1) 中目前无法实现,是否会在未来版本中添加还有待观察 - 目前它仅支持通过单个属性进行映射


查看完整回答
反对 回复 2021-10-23
?
波斯汪

TA贡献1811条经验 获得超4个赞

我在这里建议两件事:


您可以像这样手动定义列名:


public class Customer

{

    public int Id;

    public CustomerAddress StatementAddress;

    [Column("StatementAddress_ForStatement")]

    public bool AlwaysTrue => true;

    [Column("StatementAddress_CustomerCode")]

    public string Code;

}

您可以ForeignKeyAttribute像这样指定外键:


public class Customer

{

    public int Id;

    public CustomerAddress StatementAddress;

    [ForeignKey("StatementAddress"), Column(Order = 1)]

    public bool AlwaysTrue => true;

    [ForeignKey("StatementAddress"), Column(Order = 0)]

    public string Code;

}

请记住,对于此选项,您必须设置列顺序属性以匹配CustomerAddress表中外键所具有的属性。


希望这可以帮助!


查看完整回答
反对 回复 2021-10-23
  • 2 回答
  • 0 关注
  • 162 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信