如何在Simple.Data中正确执行急切加载?
本文关键字:执行 加载 Simple Data | 更新日期: 2023-09-27 18:01:49
当我尝试进行急切加载(.WithXyz()
方法)时,我得到了错误的数据。它尝试使用两个表的主Id进行连接,而不是使用连接到副表Id的主表上的"属性"。
这是一个bug在我的代码,在Simple.Data。MySql还是Simple.Data?
我正在使用Simple的版本。从NuGet.
获取数据(0.18.3.1)和简单数据(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');
看起来(从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,以便显式连接工作。