【问题标题】:Mapping a collection and a single navigation property that point to the same table映射指向同一个表的集合和单个导航属性
【发布时间】:2014-07-04 11:29:58
【问题描述】:

我有以下型号:

public class Customer
{
    [Key]
    [ForeignKey("MainAddress")]
    [Column(Order = 1)]
    public string CustomerNumber { get; set; }

    // .. some more standard props that aren't keys/FKs etc

    [ForeignKey("MainAddress")]
    [Column(Order = 2)]
    public string MainAddressCode { get; set; }

    [Include]
    [Association("Addresses", "CustomerNumber", "CustomerNumber")]
    public IList<CustomerAddress> Addresses { get; set; }

    [Include]
    [Association("MainAddress", "CustomerNumber,MainAddressCode", "CustomerNumber,CustomerAddressCode")]
    public CustomerAddress MainAddress { get; set; }
}

public class CustomerAddress
{
    public string CustomerNumber { get; set; }

    public string CustomerAddressCode { get; set; }

    // .. address props after this
}

我希望能够获取实体框架来检索客户的地址列表,但也可以使用 MainAddressCode 字段结合 CustomerNumber 检索主地址

目前我能得到的最接近的是生成的查询如下所示:

SELECT 
    1 AS [C1], 
    [Extent1].[CustomerNumber] AS [CustomerNumber], 
    [Extent1].[CustomerName] AS [CustomerName], 
    [Extent1].[MainAddressCode] AS [MainAddressCode], 
    [Extent2].[CustomerNumber] AS [CustomerNumber1], 
    [Extent2].[CustomerAddressCode] AS [CustomerAddressCode], 
    [Extent2].[Customers_CustomerNumber] AS [Customer_CustomerNumber] <--- Argh!
    FROM  [dbo].[Customers] AS [Extent1]
    LEFT OUTER JOIN [dbo].[CustomerAddress] AS [Extent2] ON ([Extent1].[MainAddressCode] = [Extent2].[CustomerAddressCode]) AND ([Extent1].[CustomerNumber] = [Extent2].[CustomerNumber])

我认为这是因为 EF 按照惯例在 CustomerAddress 表的 FK 前面添加了 Customer 实体名称的前缀。

如何在CustomerAddress 表上指定外键的列名,以便查询正确执行?我是否需要使用 fluent API 而不是属性?

【问题讨论】:

    标签: entity-framework wcf-ria-services


    【解决方案1】:

    这样结束了:

    var config = modelBuilder.Entity<Customer>();
    
            config.HasMany(x => x.Addresses)
                .WithRequired()
                .HasForeignKey(x => new { x.CustomerNumber });
    
            config.HasRequired(x => x.MainAddress)
                .WithMany()
                .HasForeignKey(x => new { x.CustomerNumber, x.MainAddressCode });
    

    到目前为止似乎有效!

    【讨论】:

      猜你喜欢
      • 2015-10-17
      • 1970-01-01
      • 2023-02-10
      • 1970-01-01
      • 2013-10-19
      • 1970-01-01
      • 1970-01-01
      • 2019-08-02
      • 1970-01-01
      相关资源
      最近更新 更多