2

我们正在尝试在遗留数据库上使用实体框架代码优先 (5.0),其中涉及连接表的常见模式存在一些问题。

例如,一个客户可以有多个地址,但地址表也用于其他类型的地址,因此有一个连接表将客户与其地址联系起来:客户 -> 客户地址 -> 地址。连接表 CustomerAdress 有一个 customer-Id 和一个 address-Id。

在我们的模型中,我们只有一个 Customer 类和一个 Address 类,简化如下:

public class Customer
{
    public long Id { get; set; }
    public IList<Address> Addresses { get; set; }
}
public class Address
{
    public long Id { get; set; }
}

我们使用如下代码在 OnModelCreating 中设置映射:

modelBuilder.Entity<Customer>()
            .HasMany(o => o.Addresses)
            .WithMany()
                .Map(m =>
                    {
                        m.ToTable("CustomerAddress");
                        m.MapLeftKey("CustomerId");
                        m.MapRightKey("AddressId");
                    });

一切正常,但是当我们尝试对包含()地址的客户进行查询时,生成的 sql 看起来非常复杂,从具有多个连接的选择中进行选择,并且在添加另一个这样的关系后,sql 的数量会爆炸。

如果为这种关系手动编码 sql,我将使用从 Customer 到 CustomerAddress 的左外连接,然后从 CustomerAddress 到 Address 的连接。有什么方法可以让实体框架为这个例子创建一个更简单的 sql 语句?

4

0 回答 0