C# 如何在Simple.Data中正确执行即时加载?

C# 如何在Simple.Data中正确执行即时加载?,c#,mysql,.net,sql,simple.data,C#,Mysql,.net,Sql,Simple.data,当我尝试执行一个紧急加载(.WithXyz()方法)时,我返回了错误的数据。它尝试使用两个表的主Id进行连接,而不是使用与辅助表Id连接的主表上的“属性” 这是我的代码、Simple.Data.MySql还是Simple.Data中的一个bug 我使用的是NuGet的Simple.Data(0.18.3.1)和Simple.Data.MySql(0.18.3.0)版本 我的代码: var traceListener = new SimpleDataTraceListener(); // For

当我尝试执行一个紧急加载(
.WithXyz()
方法)时,我返回了错误的数据。它尝试使用两个表的主Id进行连接,而不是使用与辅助表Id连接的主表上的“属性”

这是我的代码、Simple.Data.MySql还是Simple.Data中的一个bug

我使用的是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');
看起来MySQL提供程序处理外键的方式可能有问题。提供程序是为MySQL 4.0编写的;自该版本以来,语法可能发生了很大变化

我建议在该项目的GitHub页面()上提出一个问题,或者如果可以的话,可以帮助解决一个pull请求

同时,您可以像这样显式指定联接:

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,以便显式连接可以工作