2011-03-17 24 views
1

我试图做EF一个简单的多到一的关系,并确定它像:F# - > EF生成错误的SQL

type Car() = 
    [<DefaultValue>] val mutable private id : int 
    member x.ID with get() = x.id and set(v) = x.id <- v 
    [<DefaultValue>] val mutable private carName : string 
    member x.CarName with get() = x.carName and set(v) = x.carName <- v 
    [<DefaultValue>] val mutable private dealer : Dealer 
    member x.Dealer with get() = x.dealer and set(v) = x.dealer <- v 

and Dealer() = 
    [<DefaultValue>] val mutable private id : int 
    member x.ID with get() = x.id and set(v) = x.id <- v 
    [<DefaultValue>] val mutable private name : string 
    member x.Name with get() = x.name and set(v) = x.name <- v 
    [<DefaultValue>] val mutable private cars : seq<Car> 
    member x.Cars with get() = x.cars and set(v) = x.cars <- v 

type MyContext() = 
    inherit DbContext("MyContext") 
    [<DefaultValue(true)>] val mutable private cars : DbSet<Car> 
    member x.Cars with get() = x.cars and set(v) = x.cars <- v 
    [<DefaultValue(true)>] val mutable private dealers : DbSet<Dealer> 
    member x.Dealers with get() = x.dealers and set(v) = x.dealers <- v 

,把它在控制台启动方式如下:

let ctx = new MyContext() 
Query.query <@ seq { for x in ctx.Cars do if x.CarName = "Volvo" then yield x.Dealer.Name } @> 

上面会生成以下SQL查询:

SELECT 
[Extent2].[Name] AS [Name] 
FROM [dbo].[Cars] AS [Extent1] 
LEFT OUTER JOIN [dbo].[Dealers] AS [Extent2] ON [Extent1].[Dealer_ID] = [Extent2].[ID] 
WHERE N'Volvo' = [Extent1].[CarName] 

现在是我的问题,为什么它需要在规定的经销商汽车类型并将其翻译为Dealer_ID而不是DealerID?

+0

你的车表有什么专栏? DealerID或Dealer_ID?你是如何制作桌子的? – 2011-03-17 11:01:42

+0

@Ladislav Mrnka - 在我的Car表中,指代'Dealer'的列被命名为'DealerID' - 我自己创建了表(不生成) – ebb 2011-03-17 11:04:40

+0

这似乎不是F#特定的问题。 (F#语句仅转换为C#样式表达式树,而表达式树包含属性的MemberInfo,因此它不能包含错误的名称)。 – 2011-03-17 12:10:25

回答