Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 短小精悍的多重映射_C#_Dapper - Fatal编程技术网

C# 短小精悍的多重映射

C# 短小精悍的多重映射,c#,dapper,C#,Dapper,我有一个目标: public class Species : IEntity<int> { public int Id { get; set; } public string Name { get; set; } public SpeciesCategory Category { get; set; } public WetlandIndicator WetlandIndicator { get; set; } } public class

我有一个目标:

public class Species : IEntity<int>
{
     public int Id { get; set; }
     public string Name { get; set; }
     public SpeciesCategory Category { get; set; }
     public WetlandIndicator WetlandIndicator { get; set; }
}

public class SpeciesCategory : IEntity<int>
{
     public int Id { get; set; }
     public string Name { get; set; }
}

public class WetlandIndicator : IEntity<string>
{
     public string Id { get; set; }
     public string Designation { get; set; }
     public bool Status { get; set; }
}
我收到“确保使用多重映射时,确保使用
splitOn
属性”。我是,但我仍然收到错误。所以我假设我有某种类型的使用错误或语法错误。持续出错的代码如下所示:

public async Task<IEnumerable<SpeciesDomain>> GetAllSpecies(string query) =>
        await dbConnection.QueryAsync<Species, SpeciesCategory, WetlandIndicator, SpeciesDomain>(query, (species, speciesCategory, wetlandIndicator) =>
        {
            species.SpeciesCategory = speciesCategory;
            species.WetlandIndicator = wetlandIndicator;
            return species;
        }, splitOn: "Id, Code");
公共异步任务GetAllSpecies(字符串查询)=>
等待dbConnection.QueryAsync(查询,(物种、物种类别、wetlandIndicator)=>
{
species.SpeciesCategory=物种类别;
物种。湿着陆指示器=湿着陆指示器;
返回物种;
},splitOn:“Id,Code”);

重要提示:默认情况下,Dapper使用Id,这就是为什么我将代码重命名为Id,但即使使用代码或重命名,我仍然会收到一个多重映射错误。

看起来您只需要从splitOn中删除“代码”:“Id,代码”。您的查询将其重命名为“Id”

Dapper还使用“Id”作为默认值,因此无需指定

Dapper能够通过假设来分割返回的行 您的Id列被命名为Id或Id。如果您的主键不同 或者要在Id以外的点拆分行,请使用 可选的splitOn参数

以下是验证的快速测试:

using (var conn = new SqlConnection(@"Data Source=.\sqlexpress;Integrated Security=true; Initial Catalog=foo"))
{
    var result = conn.Query<Species, SpeciesCategory, WetlandIndicator, Species>(
        "select Id = 11, Name = 'Foo', Id = 22, Name = 'Bar', Id = 33, Designation = 'House Cat' ", 
        (species, speciesCategory, wetlandIndicator) =>
    {
        species.Category = speciesCategory;
        species.WetlandIndicator = wetlandIndicator;
        return species;
    }).First();

    Assert.That(result.Id, Is.EqualTo(11));

    Assert.That(result.Category.Id, Is.EqualTo(22));
    Assert.That(result.Category.Name, Is.EqualTo("Bar"));

    Assert.That(result.WetlandIndicator.Id, Is.EqualTo(33));
    Assert.That(result.WetlandIndicator.Designation, Is.EqualTo("House Cat"));
}
使用(var conn=new SqlConnection(@“Data Source=。\sqlexpress;Integrated Security=true;Initial Catalog=foo”))
{
var结果=连接查询(
“选择Id=11,名称='Foo',Id=22,名称='Bar',Id=33,名称='House Cat'”,
(物种、物种类别、湿地指示器)=>
{
物种类别=物种类别;
物种。湿着陆指示器=湿着陆指示器;
返回物种;
}).First();
Assert.That(result.Id,Is.EqualTo(11));
Assert.That(result.Category.Id,Is.EqualTo(22));
Assert.That(result.Category.Name,Is.EqualTo(“Bar”);
Assert.That(result.WetlandIndicator.Id,Is.EqualTo(33));
断言(result.WetlandIndicator.Designation,Is.EqualTo(“家猫”));
}
按不同字段和类型划分的演示更新

public class Species
{
    public int Id { get; set; }
    public string Name { get; set; }
    public SpeciesCategory Category { get; set; }
    public WetlandIndicator WetlandIndicator { get; set; }
}

public class SpeciesCategory
{
    public int Id { get; set; }
    public string Name { get; set; }
}

public class WetlandIndicator
{
    public string Code { get; set; }
    public string Designation { get; set; }
    public bool Status { get; set; }
}

using (var conn = new SqlConnection(@"Data Source=.\sqlexpress;Integrated Security=true; Initial Catalog=foo"))
{
    var result = conn.Query<Species, SpeciesCategory, WetlandIndicator, Species>(
        "select Id = 11, Name = 'Foo', Id = 22, Name = 'Bar', Code = 'X', Designation = 'House Cat' ", 
        (species, speciesCategory, wetlandIndicator) =>
    {
        species.Category = speciesCategory;
        species.WetlandIndicator = wetlandIndicator;
        return species;
    }, splitOn: "Id, Code").First();

    Assert.That(result.Id, Is.EqualTo(11));

    Assert.That(result.Category.Id, Is.EqualTo(22));
    Assert.That(result.Category.Name, Is.EqualTo("Bar"));

    Assert.That(result.WetlandIndicator.Code, Is.EqualTo("X"));
    Assert.That(result.WetlandIndicator.Designation, Is.EqualTo("House Cat"));
}
公共类物种
{
公共int Id{get;set;}
公共字符串名称{get;set;}
公共物种类别{get;set;}
公共湿着陆指示器湿着陆指示器{get;set;}
}
公共类物种类别
{
公共int Id{get;set;}
公共字符串名称{get;set;}
}
公共类湿着陆指示器
{
公共字符串代码{get;set;}
公共字符串名称{get;set;}
公共布尔状态{get;set;}
}
使用(var conn=new SqlConnection(@“数据源=。\sqlexpress;集成安全性=true;初始目录=foo”))
{
var结果=连接查询(
“选择Id=11,名称='Foo',Id=22,名称='Bar',代码='X',名称='House Cat'”,
(物种、物种类别、湿地指示器)=>
{
物种类别=物种类别;
物种。湿着陆指示器=湿着陆指示器;
返回物种;
},splitOn:“Id,Code”).First();
Assert.That(result.Id,Is.EqualTo(11));
Assert.That(result.Category.Id,Is.EqualTo(22));
Assert.That(result.Category.Name,Is.EqualTo(“Bar”);
Assert.That(result.WetlandIndicator.Code,Is.EqualTo(“X”));
断言(result.WetlandIndicator.Designation,Is.EqualTo(“家猫”));
}

因此,我找到了它失败的主要原因。Dapper不喜欢在
int
string
之间交替使用
splitOn
参数。通过迫使所有国家统一起来,它起了作用。我注意到的另一点是,例如,如果您有一个名为
code
的列,它镜像主键,但SQL没有设置为关系标识符,那么它也会出错


在这些问题得到纠正之后,它就没有问题了。

只是为了向其他人澄清:如果使用不同数据类型的字段进行拆分,Dapper不会失败。我将更新我的演示答案。我需要澄清,如果您有字段:“代码”和一个名为“代码”的Id列问题。
public class Species
{
    public int Id { get; set; }
    public string Name { get; set; }
    public SpeciesCategory Category { get; set; }
    public WetlandIndicator WetlandIndicator { get; set; }
}

public class SpeciesCategory
{
    public int Id { get; set; }
    public string Name { get; set; }
}

public class WetlandIndicator
{
    public string Code { get; set; }
    public string Designation { get; set; }
    public bool Status { get; set; }
}

using (var conn = new SqlConnection(@"Data Source=.\sqlexpress;Integrated Security=true; Initial Catalog=foo"))
{
    var result = conn.Query<Species, SpeciesCategory, WetlandIndicator, Species>(
        "select Id = 11, Name = 'Foo', Id = 22, Name = 'Bar', Code = 'X', Designation = 'House Cat' ", 
        (species, speciesCategory, wetlandIndicator) =>
    {
        species.Category = speciesCategory;
        species.WetlandIndicator = wetlandIndicator;
        return species;
    }, splitOn: "Id, Code").First();

    Assert.That(result.Id, Is.EqualTo(11));

    Assert.That(result.Category.Id, Is.EqualTo(22));
    Assert.That(result.Category.Name, Is.EqualTo("Bar"));

    Assert.That(result.WetlandIndicator.Code, Is.EqualTo("X"));
    Assert.That(result.WetlandIndicator.Designation, Is.EqualTo("House Cat"));
}