Dapper多对多关系多重映射

8

我正在尝试使用Dapper在MySQL数据库中映射N-N关系。以下是大致的代码:

        var query = new StringBuilder();
        query.Append("SELECT O.Id, O.Email, O.Status, P.Name FROM Owners AS O");
        query.Append(" INNER JOIN OwnerPets OP ON OP.OwnerId = O.Id");
        query.Append(" INNER JOIN Pets AS P ON P.Id = OP.PetId");
        query.Append(" WHERE O.Status = @Status;");

        using (var dbConnection = CreateConnection())
        {
            return dbConnection.Query<Owner, IEnumerable<Pet>, Owner>(query.ToString(), (owner, pets) =>
            {
                owner.Pets = pets.ToList();
                return Owner;
            }, new { Status = status }, splitOn: "OwnerId, PetId");
        }

在SQL客户端中,查询可以正常工作,但是当我运行上面的代码时,会出现以下异常:"使用多重映射API时,请确保设置splitOn参数(如果您有除Id之外的键)。参数名称:splitOn"

是否可能映射一个具有中间表(OwnerPets)的N-N关系?如果可以,那么我做错了什么?

1个回答

11

我不确定你是否可以直接让 Dapper 返回你想要的数据,但你可以加载数据,使得所有拥有者和宠物之间都是一对一的关系,然后使用 LINQ 查询来为每个拥有者分组其所拥有的宠物。

return dbConnection
    .Query<Owner, Pet, Owner>(
        query,
        (owner, pet) =>
        {
            owner.Pets = owner.Pets ?? new List<Pet>();
            owner.Pets.Add(pet);
            return owner;
        },
        new { Status = status },
        splitOn: "Name"
    )
    .GroupBy(o => o.Id)
    .Select(group =>
    {
        var combinedOwner = group.First();
        combinedOwner.Pets = group.Select(owner => owner.Pets.Single()).ToList();
        return combinedOwner;
    });

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接