【问题标题】:NPoco fetchOneToMany errorNPoco fetchOneToMany 错误
【发布时间】:2014-09-28 17:32:02
【问题描述】:

我正在尝试使用 NPoco 的 fetchOneToMany 方法将对象映射到嵌套对象列表,如下this link

[TableName("sds_ingredients_ing")]
[PrimaryKey("ing_id")]
public class Ingredient
{
    [Column(Name = "ing_id")]
    public int Id { get; set; }
    [Column(Name = "ing_cas")]
    public string Cas { get; set; }
    [Ignore]
    public IList<IngredientLang> Ingredient_Lang;
}

[TableName("sds_ingredients_lang")]
[PrimaryKey("ing_id")]
public class IngredientLang
{
    [Column(Name = "ing_id")]
    public int Id { get; set; }
    [Column(Name = "lang_id")]
    public int LangId { get; set; }
    [Column(Name = "Name")]
    public string Name { get; set; }
}

这里是查询:

List<Ingredient> list = db.FetchOneToMany<Ingredient, IngredientLang>(x => x.Id,
    @"SELECT     ing.*, 
                 lang.*
      FROM       SDS_INGREDIENTS_ING ing 
      LEFT JOIN  SDS_INGREDIENTS_LANG lang 
      ON         ing.ING_ID=lang.ING_ID");

Npoco 返回以下错误:No Property of type ICollection`1 found on object of type: Ingredient,这让我很困惑,因为类 Ingredient 确实具有 IList 类型的属性。我们尝试了 List、IList、IEnumerable 以及几乎所有我们能想到的集合类型,但都没有奏效。

你知道可能出了什么问题吗?

【问题讨论】:

  • 反斜杠对 ing.\* 和 lang.\* 有什么作用?似乎是无效的 SQL 语法。
  • 很抱歉。我是stackoverflow的新手,我使用[code]标签,在女巫之间,'*'字符由于某种原因不会显示。我通过在它之前添加 \ 来解决它,c++ 风格。然后我删除了 [code] 标签,因为我意识到你所要做的就是缩进,但我忘了删除反斜杠。现已修复。

标签: c# sql petapoco npoco


【解决方案1】:
 public partial class Graph
 {
    [Reference(ReferenceType.Many, ColumnName = "GraphId", 
     ReferenceMemberName = "GraphId")]
    [Column] public List<Plot> Plots { get; set; }
...
[TableName("Graph")]
[PrimaryKey("GraphId")]
[ExplicitColumns]
public partial class Graph : fooDB.Record<Graph>  
{   
...

在逐步浏览 NPoco 3.2.0 的源代码后,我了解到我需要将 [Column] 放在 List 成员上,以便在调用 FetchOneToMany 后在我的类中引出预期的子父级:

results = tdb.FetchOneToMany<Graph>(g => g.Plots, _plotsByReview, reviewId);

此外,请保持您的选择列与父列之后的子列连续:

private static string _plotsByReview = @"
        select 
        g.GraphId,
        g.GraphName,
        g.UserId,
        g.Shared,
        g.ReviewId,
        p.PlotId as Plots__PlotId,
        p.GraphId as Plots__GraphId,
        p.TagId as Plots__TagId,
        p.YAxis as Plots__YAxis,
        p.Relabel as Plots__Relabel,
        p.Scale as Plots__Scale,
        p.MinY as Plots__MinY,
        p.MaxY as Plots__MaxY
        from [Graph] g
        inner join [Plot] p on p.GraphId = g.GraphId
        where g.ReviewId = @0
    ";

NPoco 规则!!!

【讨论】:

    【解决方案2】:

    Ingredient_Lang 不是属性。它是一个领域。 如果你让它成为一个属性,它应该可以工作。

    【讨论】:

    • 只是问,[Ignore]属性也没有问题吗?还是我误解了注释?
    • 您说的很对,我们通过添加相应的 get/set 方法来修复它。我不太了解字段和属性之间的区别,我对 C# 还是很陌生。谢谢!如果我有所需的声誉,我会投票。
    猜你喜欢
    • 2012-10-12
    • 2012-12-20
    • 2019-10-09
    • 2019-09-19
    • 1970-01-01
    • 2014-02-03
    • 2016-10-16
    • 2014-01-31
    • 2013-03-07
    相关资源
    最近更新 更多