与一方自定义主键的多对多EF关系

时间:2016-04-01 14:16:20

标签: c# entity-framework ef-fluent-api

我觉得这个问题很傻,但我从来没有做过这样的事情而且我被困住了。

我很高兴在传统设计上工作,有一些"陷阱"这里和那里。其中之一是两个表之间不正确定义的多对多关系。它是这样的:

表A

Id,Number

表B

编号

表格AToB

NumberOfA,IdOfB

所以要用SQL加入它,就必须做这样的事情:

SELECT A.*, B.*
FROM A
JOIN AToB ON AToB.NUmberOfA = A.Number
JOIN B ON AToB.IdOfB = B.Id

是的,我知道。这是一个糟糕的设计。我应该尽快改变它。我会的。但就目前而言,我需要为基于EF的原型提供快速而肮脏的解决方案。这显然不起作用

public class A
{
    public long Id {get; set;}
    public string Name {get; set;}
}

public class B
{
    public long Id {get; set;}
}

...

internal class BConfiguration : EntityTypeConfiguration<B>
{
this.ToTable("B")
  .HasKey(t => t.Id);

...

internal class AConfiguration : EntityTypeConfiguration<A>
{
this.ToTable("A")
  .HasKey(t => t.Id);

this.HasMany<B>(t => t.EntitiesOfB)
                .WithMany(t => t.EntitiesOfA)                
                .Map(m =>
                {                   
                    m.MapLeftKey("IdOfB");
                    m.MapRightKey("NumberOfA");
                    m.ToTable("AToB");
                });

因为它希望 AToB 的映射在两端引用A和B的主键列,而我希望它使用 AToB.NumberOfA = A.Number 相反,但仅限于此特定映射。在关系中使用表格 A 的所有其他映射应该仍然可以使用它正确定义的 Id 键列。

是否存在针对此类情况的EF6 FluentAPI解决方案?

0 个答案:

没有答案