强制HasMany()使用关联表

本文关键字:关联 HasMany 强制 | 更新日期: 2023-09-27 18:26:33

这里的第一个问题,即使我已经浏览堆栈好几年了。

我在实体框架和迁移方面有问题,更确切地说是在映射方面。我很清楚关于多对多、一对多、关联表之类的所有问题,但我还没有找到这个特定问题的解决方案:

这些是我的POCO:

public class A
{
    public virtual long Id {get; set;}
    public virtual ICollection<B> B {get; set;}
}
public class B
{
    public virtual long Id {get; set;}
    // Not relevant stuff ...
}

我想强制映射给我一个关联表,可能看起来像这样:

-----------   -----------   -----------
| TABLE A |   | TABLE AB|   | TABLE B |
-----------   -----------   -----------
| ID      |   | FK_A_ID |   | ID      |
-----------   | FK_B_ID |   -----------
              -----------

我的第一反应是使用这种映射:

modelBuilder.Entity<A>()
                .HasMany(x => x.B)
                .WithMany()
                .Map(x =>
                {
                    x.ToTable("AB");
                    x.MapLeftKey("Id");
                    x.MapRightKey("Id");
                });

不幸的是,这并没有在数据库中为我提供所需的映射,因为它在表a中创建了一个引用B.Id的外键。此外,我不希望在B类中的a上有属性。有关信息,目标数据库为SqlServer。

有合适的方法吗?

注意:我不是以英语为母语的人,如果我犯了错误,请原谅我。

强制HasMany()使用关联表

不确定为什么要尝试实现这一点,但这是可能的。

在我脑海中出现的低形是,你不能编辑AB,但你想要很多关系。。。所以这是一个解决方案:

只需创建一个id为AB的类AB,然后用装饰符定义密钥和鉴别器

class AB {
    virtual public A ALink {get; set;}
    [Key, Column(Order = 0)]
    public int ALinkId {get; set;}
    virtual public B BLink {get; set;}
    [Key, Column(Order = 1)]
    public it BLinkId {get; set;}
}