【问题标题】:How to map many to many relation to a list with dapper如何使用 dapper 将多对多关系映射到列表
【发布时间】:2016-05-04 08:11:02
【问题描述】:

我有一个类 AnalysisRule

public class AnalysisRule
{
    public long Id { get; set; }
    public Analysis Analysis { get; set; }
    public AnalysisCategory AnalysisCategory { get; set; }
    public Gender Gender { get; set; }
    public bool FatherHerdBookRequired { get; set; }
    public bool MotherHerdBookRequired { get; set; }
    public List<Breed> AllowedBreeds { get; set; }
}

有一个品种列表

public class Breed
{
    public long BreedId { get; set; }
    public long AnimalTypeId { get; set; }
    public long BreedCode { get; set; }
    public string BreedName { get; set; }
    public string BreedAcronym { get; set; }
}

这是我与数据库表绑定在一起的多对多关系 分析规则品种

品种

和分析规则

我尝试过使用 Dapper

    var sql = @"select *
                from ""AnalysisRules"" 
                join ""AnalysisCategory"" on ""AnalysisRules"".""AnalysisCategoryId"" = ""AnalysisCategory"".""Id""  
                join ""Analysis"" on ""AnalysisRules"".""AnalysisId"" = ""Analysis"".""Id""
                left join ""AnalysisRulesBreeds"" on ""AnalysisRulesBreeds"".""AnalysisRuleId"" = ""AnalysisRules"".""Id""
                left join ""Breed"" on ""AnalysisRulesBreeds"".""BreedId"" = ""Breed"".""BreedId""
                where ""AnalysisId"" = :AnalysisId";
    rules = sqlConnection.QueryAsync<AnalysisRule, AnalysisCategory, Analysis, Breed, AnalysisRule>(
        sql,
        (ar, c, a, b) =>
        {
            ar.AnalysisCategory = c;
            ar.Analysis = a;
            ar.Breeds.Add(b);
            return ar;
        },
        new
        {
            AnalysisId = analysisId
        },
        splitOn:"BreedId");

这给了我

´使用多映射 API 时,如果您有除 Id 以外的键,请确保设置 splitOn 参数 参数名称:splitOn

如果我在 SQL Developer 中运行相同的查询,我会得到 2 行具有相同 ID 但在 Breed 中具有不同数据的行,因此查询应该足够好。

那么如何将这 2 行放入一个 AnalysisRule 实体中,其中 Breeds 由 2 个 Breed 实体组成?

编辑 我现在有

                    sqlConnection.Open();

                var sql = @"select  ar.*,
                                    ac.*,
                                    b.*                 

                            from ""AnalysisRules"" ar
                            join ""AnalysisCategory"" ac on ar.""AnalysisCategoryId"" = ac.""Id""  
                            join ""Analysis"" a on ar.""AnalysisId"" = a.""Id""

                            left join ""AnalysisRulesBreeds""  on ""AnalysisRulesBreeds"".""AnalysisRuleId"" = ar.""Id""
                            left join ""Breed"" b  on ""AnalysisRulesBreeds"".""BreedId"" = b.""Id""

                            where ""AnalysisId"" = :AnalysisId";

                var rules = sqlConnection.QueryAsync<AnalysisRule, AnalysisCategory, Analysis, Breed, AnalysisRule>(
                    sql,
                    (ar, c, a, b) =>
                    {
                        ar.AnalysisCategory = c;
                        ar.Analysis = a;
                        ar.Breeds.Add(b);
                        return ar;
                    },
                    new
                    {
                        AnalysisId = analysisId
                    });

                return await rules;

删除了 splitOn,将 AnalysisRulesBreedsId 更改为 Id 但我仍然得到 ​​p>

使用多映射 API 时,如果您的键不是 Id,请确保设置 splitOn 参数 参数名称:splitOn

如果我在 SQLDev 中执行相同的查询,我会得到

【问题讨论】:

    标签: c# oracle dapper


    【解决方案1】:

    通过选择 *,您可以获得每个连接表的列。你也将splitOn设置为BreedId。现在 Dapper 期望将一个连接表的行列与下一个连接表分开,它应该查找名为 BreedId 的列。

    这不起作用,因为除了AnalysisRulesBreeds 之外的所有表都使用Id 作为id 列名。

    尝试删除splitOn 参数,然后它将默认为Id。然后调整您的选择子句以仅从结果中实际需要的表中进行选择,例如。

    select AnalysisRule.*, AnalysisCategory.*, Analysis.*, Breed.*

    (假设您的 Analysis 表和 AnalysisCategory 表遵循将 Id 列命名为“Id”的约定)。

    【讨论】:

    • 已尝试根据您的建议进行编辑,但即使我在所有表中仅使用 Id 作为 PK,我仍然收到相同的错误,请参阅编辑部分以获取我在 SQLDev 中获得的数据的屏幕截图
    • 如果 Dapper 收到的结果包含屏幕转储中显示的 id 列名称(Id、Id_1、Id_2),那么它将不起作用。甲骨文? SQL Server 中的相同查询会将 id 列命名为 Id、Id 和 Id...
    • 我是否可以将每列明确命名为 ac."Id" 为 "AnalysisCategoryId" 并以某种方式进行拆分?
    • 是的,应该可以在 splitOn 中添加一个逗号分隔的列表,例如“AnalysisCategoryId, BreedId, ...”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-27
    • 1970-01-01
    • 2016-08-07
    • 1970-01-01
    • 2021-12-19
    • 2019-05-24
    • 2014-08-17
    相关资源
    最近更新 更多