2016-07-19 27 views
0

Ich versuche, EF6 Fluent Mappings für mein aktuelles Projekt arbeiten zu lassen. Ich habe folgende Bestell Mapping:EF6 Fluent Mapping der falschen Schlüssel für Joins

public class OrderMap : EntityTypeConfiguration<Order> 
{ 
    public OrderMap() 
    { 
     this.ToTable("OE_Orders"); 
     this.Property(o => o.BillToAddress.Address1).HasColumnName("BillToAddress1"); 
     this.Property(o => o.BillToAddress.Address2).HasColumnName("BillToAddress2"); 
     this.Property(o => o.BillToAddress.City).HasColumnName("BillToCity"); 
     this.Property(o => o.BillToAddress.State).HasColumnName("BillToState"); 
     this.Property(o => o.BillToAddress.Zip).HasColumnName("BillToZip"); 
     this.Property(o => o.ShipToAddress.Address1).HasColumnName("ShipToAddress1"); 
     this.Property(o => o.ShipToAddress.Address2).HasColumnName("ShipToAddress2"); 
     this.Property(o => o.ShipToAddress.City).HasColumnName("ShipToCity"); 
     this.Property(o => o.ShipToAddress.State).HasColumnName("ShipToState"); 
     this.Property(o => o.ShipToAddress.Zip).HasColumnName("ShipToZip"); 
     this.Property(o => o.Stop).HasColumnName("RouteStopNumber"); 

     this.HasKey(o => o.OrderNumber).HasMany(o => o.OrderLines).WithRequired(ol => ol.Order).HasForeignKey(ol => ol.OrderNumber); 
     this.HasKey(o => o.CustomerKey).HasRequired(o => o.Customer).WithRequiredDependent(); 
    } 
} 

Aus irgendeinem Grund versucht diese CustomerKey auf die Orderlines statt der Auftragsnummer zuzuordnen. Ich habe keine Idee warum. Ich kann die OrderLineMap hinzufügen, wenn Sie sie auch benötigen. Die generierte SQL ist:

SELECT 
[Project1].[CustomerKey] AS [CustomerKey], 
[Project1].[OrderNumber] AS [OrderNumber], 
[Project1].[OrderDate] AS [OrderDate], 
[Project1].[InvoiceDate] AS [InvoiceDate], 
[Project1].[DeliveryDate] AS [DeliveryDate], 
[Project1].[ScheduledShipDate] AS [ScheduledShipDate], 
[Project1].[Origination] AS [Origination], 
[Project1].[RouteStopNumber] AS [RouteStopNumber], 
[Project1].[RouteCode] AS [RouteCode], 
[Project1].[BillToName] AS [BillToName], 
[Project1].[BillToAddress1] AS [BillToAddress1], 
[Project1].[BillToAddress2] AS [BillToAddress2], 
[Project1].[BillToCity] AS [BillToCity], 
[Project1].[BillToState] AS [BillToState], 
[Project1].[BillToZip] AS [BillToZip], 
[Project1].[ShipToName] AS [ShipToName], 
[Project1].[ShipToAddress1] AS [ShipToAddress1], 
[Project1].[ShipToAddress2] AS [ShipToAddress2], 
[Project1].[ShipToCity] AS [ShipToCity], 
[Project1].[ShipToState] AS [ShipToState], 
[Project1].[ShipToZip] AS [ShipToZip], 
[Project1].[EstimatedOrder] AS [EstimatedOrder], 
[Project1].[TotalWeight] AS [TotalWeight], 
[Project1].[CustomerKey1] AS [CustomerKey1], 
[Project1].[CustomerCode] AS [CustomerCode], 
[Project1].[Name] AS [Name], 
[Project1].[Phone1] AS [Phone1], 
[Project1].[Phone2] AS [Phone2], 
[Project1].[FAX] AS [FAX], 
[Project1].[Email] AS [Email], 
[Project1].[Website] AS [Website], 
[Project1].[Contact1] AS [Contact1], 
[Project1].[Contact2] AS [Contact2], 
[Project1].[Contact3] AS [Contact3], 
[Project1].[Address1] AS [Address1], 
[Project1].[Address2] AS [Address2], 
[Project1].[City] AS [City], 
[Project1].[State] AS [State], 
[Project1].[Zip] AS [Zip], 
[Project1].[C1] AS [C1], 
[Project1].[OrderNumber1] AS [OrderNumber1], 
[Project1].[LineType] AS [LineType], 
[Project1].[LineItem] AS [LineItem], 
[Project1].[TextFlag] AS [TextFlag], 
[Project1].[ProductKey] AS [ProductKey], 
[Project1].[UnitOfMeasure_SellBy] AS [UnitOfMeasure_SellBy], 
[Project1].[Quantity_SellBy] AS [Quantity_SellBy], 
[Project1].[UnitOfMeasure_Prc] AS [UnitOfMeasure_Prc], 
[Project1].[UnitOfMeasure_Stk] AS [UnitOfMeasure_Stk], 
[Project1].[UnitOfMeasure_Alt] AS [UnitOfMeasure_Alt], 
[Project1].[OrderQuantity] AS [OrderQuantity], 
[Project1].[Quantity_Stk] AS [Quantity_Stk], 
[Project1].[Quantity_Alt] AS [Quantity_Alt], 
[Project1].[Quantity_Prc] AS [Quantity_Prc], 
[Project1].[PriceDefault] AS [PriceDefault], 
[Project1].[PriceOverride] AS [PriceOverride], 
[Project1].[PriceFlag] AS [PriceFlag] 
FROM (SELECT 
    [Extent1].[CustomerKey] AS [CustomerKey], 
    [Extent1].[OrderNumber] AS [OrderNumber], 
    [Extent1].[OrderDate] AS [OrderDate], 
    [Extent1].[InvoiceDate] AS [InvoiceDate], 
    [Extent1].[DeliveryDate] AS [DeliveryDate], 
    [Extent1].[ScheduledShipDate] AS [ScheduledShipDate], 
    [Extent1].[Origination] AS [Origination], 
    [Extent1].[RouteStopNumber] AS [RouteStopNumber], 
    [Extent1].[RouteCode] AS [RouteCode], 
    [Extent1].[BillToName] AS [BillToName], 
    [Extent1].[BillToAddress1] AS [BillToAddress1], 
    [Extent1].[BillToAddress2] AS [BillToAddress2], 
    [Extent1].[BillToCity] AS [BillToCity], 
    [Extent1].[BillToState] AS [BillToState], 
    [Extent1].[BillToZip] AS [BillToZip], 
    [Extent1].[ShipToName] AS [ShipToName], 
    [Extent1].[ShipToAddress1] AS [ShipToAddress1], 
    [Extent1].[ShipToAddress2] AS [ShipToAddress2], 
    [Extent1].[ShipToCity] AS [ShipToCity], 
    [Extent1].[ShipToState] AS [ShipToState], 
    [Extent1].[ShipToZip] AS [ShipToZip], 
    [Extent1].[EstimatedOrder] AS [EstimatedOrder], 
    [Extent1].[TotalWeight] AS [TotalWeight], 
    [Extent2].[CustomerKey] AS [CustomerKey1], 
    [Extent2].[CustomerCode] AS [CustomerCode], 
    [Extent2].[Name] AS [Name], 
    [Extent2].[Phone1] AS [Phone1], 
    [Extent2].[Phone2] AS [Phone2], 
    [Extent2].[FAX] AS [FAX], 
    [Extent2].[Email] AS [Email], 
    [Extent2].[Website] AS [Website], 
    [Extent2].[Contact1] AS [Contact1], 
    [Extent2].[Contact2] AS [Contact2], 
    [Extent2].[Contact3] AS [Contact3], 
    [Extent2].[Address1] AS [Address1], 
    [Extent2].[Address2] AS [Address2], 
    [Extent2].[City] AS [City], 
    [Extent2].[State] AS [State], 
    [Extent2].[Zip] AS [Zip], 
    [Extent3].[OrderNumber] AS [OrderNumber1], 
    [Extent3].[LineType] AS [LineType], 
    [Extent3].[LineItem] AS [LineItem], 
    [Extent3].[TextFlag] AS [TextFlag], 
    [Extent3].[ProductKey] AS [ProductKey], 
    [Extent3].[UnitOfMeasure_SellBy] AS [UnitOfMeasure_SellBy], 
    [Extent3].[Quantity_SellBy] AS [Quantity_SellBy], 
    [Extent3].[UnitOfMeasure_Prc] AS [UnitOfMeasure_Prc], 
    [Extent3].[UnitOfMeasure_Stk] AS [UnitOfMeasure_Stk], 
    [Extent3].[UnitOfMeasure_Alt] AS [UnitOfMeasure_Alt], 
    [Extent3].[OrderQuantity] AS [OrderQuantity], 
    [Extent3].[Quantity_Stk] AS [Quantity_Stk], 
    [Extent3].[Quantity_Alt] AS [Quantity_Alt], 
    [Extent3].[Quantity_Prc] AS [Quantity_Prc], 
    [Extent3].[PriceDefault] AS [PriceDefault], 
    [Extent3].[PriceOverride] AS [PriceOverride], 
    [Extent3].[PriceFlag] AS [PriceFlag], 
    CASE WHEN ([Extent3].[OrderNumber] IS NULL) THEN CAST(NULL AS int) ELSE 1 END AS [C1] 
    FROM [dbo].[OE_Orders] AS [Extent1] 
    INNER JOIN [dbo].[AR_Customers] AS [Extent2] ON [Extent1].[CustomerKey] = [Extent2].[CustomerKey] 
    LEFT OUTER JOIN [dbo].[OE_OrderLines] AS [Extent3] ON [Extent1].[CustomerKey] = [Extent3].[OrderNumber] 
    WHERE [Extent1].[OrderNumber] = @p__linq__0 
) AS [Project1] 
ORDER BY [Project1].[CustomerKey] ASC, [Project1].[CustomerKey1] ASC, [Project1].[C1] ASC 

Das ist die Linie in Frage:

LEFT OUTER JOIN [dbo].[OE_OrderLines] AS [Extent3] ON [Extent1].[CustomerKey] = [Extent3].[OrderNumber] 

nicht sicher, wie es zu beheben. Ich könnte einen Rat oder einige Ressourcen verwenden, um mir zu helfen herauszufinden, warum es falsch zugeordnet ist.

Lassen Sie mich wissen, wie ich diese Informationen aktualisieren kann, um sie informativer zu machen.

Vielen Dank für Ihre Zeit!

+0

Ist 'Order' ->' Customer' Beziehung wirklich 'eins zu "eins"? Es ist seltsam, normalerweise hat ein 'Kunde' viele' 'Ordnungen', nicht wahr? –

+0

@IvanStoev Ja, der Kunde hat viele Aufträge, aber ich ordne dem Kunden keine Auftragssammlung zu. Es wäre zu viel. Ich kann es hinzufügen, aber es ist nicht notwendig für diese Anwendung. – Carson

+0

Es ist nicht unbedingt eine Sammlung. Aber 'Has'/'With' muss mit der Kardinalität der Beziehung übereinstimmen. Lass mich dich anders fragen - ist 'Order.CustomerKey' eine FK zu' Customer' Tabelle? –

Antwort

2

Das Problem ist in diesen beiden Zeilen aus der Konfiguration:

this.HasKey(o => o.OrderNumber).HasMany(o => o.OrderLines).WithRequired(ol => ol.Order).HasForeignKey(ol => ol.OrderNumber); 
this.HasKey(o => o.CustomerKey).HasRequired(o => o.Customer).WithRequiredDependent(); 

In den EF Fluent API Begriffe, HasKey bedeutet Abbilden des Primärschlüssel, und Sie haben es zweimal angegeben. Da der letztere Vorrang hat (überschreibt die vorherige Einstellung), bildet EF die Spalte CustomerKey als PK der Tabelle Order ab.

Die richtige Konfiguration so sein sollte (ich würde Ihnen vorschlagen, nicht die Eigenschaft, mischen, PK und Vereinigungs Mappings):

this.HasKey(o => o.OrderNumber); 

this.HasMany(o => o.OrderLines) 
    .WithRequired(ol => ol.Order) 
    .HasForeignKey(ol => ol.OrderNumber); 

this.HasRequired(o => o.Customer) 
    .WithMany() 
    .HasForeignKey(o => o.CustomerKey); 
+0

Perfekt! Vielen Dank! – Carson

+1

Gern geschehen, froh das geholfen hat :) Happy Coding! –