2013-02-28 25 views
1

当我尝试做一个急切的加载(.WithXyz()方法)时,我得到了错误的数据。它尝试使用两个表的主Id进行连接,而不是主表上的“属性”连接到辅助表的Id。如何在Simple.Data中正确执行加载?

这是我的代码,在Simple.Data.MySql,或在Simple.Data中的错误?

我使用NuGet的Simple.Data(0.18.3.1)和Simple.Data.MySql(0.18.3.0)的版本。

我的代码:

var traceListener = new SimpleDataTraceListener(); // For logging SQL 
Trace.Listeners.Add(traceListener); 

var db = Database.Open(); 
OrderItem orderItem = db.OrderItems 
    .WithCustomer() 
    .Get(1) 
    ; 

Console.WriteLine(traceListener.Output); 
Console.WriteLine(orderItem.Customer.FullName); 

下面是SQL的一个例子,我希望:

SELECT orderitem.id, 
     orderitem.customer_Id, 
     orderitem.productname, 
     customer.id AS __with1__Customer__id, 
     customer.fullname AS __with1__Customer__fullname 
FROM orderitem 
LEFT JOIN customer ON (orderitem.customer_Id = customer.id) 
WHERE orderitem.id = ?p1 LIMIT 0, 1 

?p1 (UInt64) = 1 

这里是它实际上是创建SQL的日志:

select orderitem.id, 
     orderitem.customer_Id, 
     orderitem.productname, 
     customer.id AS __with1__Customer__id, 
     customer.fullname AS __with1__Customer__fullname 
from orderitem 
LEFT JOIN customer ON (orderitem.id = customer.id) 
WHERE orderitem.id = ?p1 LIMIT 0, 1 

?p1 (UInt64) = 1 

我的数据:

CREATE TABLE `customer` (
    `id` BIGINT(20) NOT NULL AUTO_INCREMENT, 
    `fullname` VARCHAR(130) NOT NULL, 
    PRIMARY KEY (`id`), 
    UNIQUE INDEX `fullname_UNIQUE` (`fullname` ASC) 
); 

CREATE TABLE `orderitem` (
    `id` BIGINT(20) NOT NULL AUTO_INCREMENT, 
    `customer_Id` BIGINT(20) NOT NULL, 
    `productname` VARCHAR(130) NOT NULL, 
    PRIMARY KEY (`id`), 
    FOREIGN KEY (`customer_Id`) REFERENCES `customer` (`id`) 
); 

INSERT INTO `customer` (fullname) 
VALUES ('wall-E'), ('merlyn'), ('someone'); 

INSERT INTO `orderitem` (customer_Id, productName) 
VALUES (3, 'test item 1'), (2, 'test item 2'), (1, 'test item 3'); 

回答

2

它看起来像(从https://github.com/Vidarls/Simple.Data.Mysql/blob/master/Src/Simple.Data.Mysql.Mysql40/MysqlForeignKeyCreator.cs)就像MySQL提供程序处理外键的方式可能存在问题。该提供者是为MySQL 4.0编写的;自该版本以来,语法可能发生了相当大的变化

我建议在该项目的GitHub页面上提出一个问题(https://github.com/Vidarls/Simple.Data.Mysql/issues),或者如果可以的话,也许可以帮助提出请求。

在此期间,你可以明确地加入这样的:

var db = Database.Open(); 
dynamic customer; 
OrderItem orderItem = db.OrderItems 
    .FindAllById(1) 
    .OuterJoin(db.Customers.As("Customer"), out customer) 
    .On(Id: db.OrderItems.CustomerId) 
    .With(customer) 
    .FirstOrDefault(); 

我也改为使用查询和FirstOrDefault代码,使显式连接工程。