Dapper Correct Object/Aggregate Mapping

mre*_*ros 7 dapper

我最近开始评估Dapper作为EF的潜在替代品,因为我对生成的SQL不太满意,并希望对它进行更多控制.我有一个关于在我的域模型中映射复杂对象的问题.假设我有一个名为Provider的对象,Provider可以包含几个IEnumerable类型的属性,这些属性只能通过父提供者对象(即聚合根)来访问.我已经看过使用QueryMultiple和Map扩展方法解释过的类似帖子,但是想知道如果我想编写一个方法来重新加载整个对象图,如果Dapper能够一举做到这一点或者如果需要做一顿饭.举一个例子,我可以说我的对象看起来如下所示:

public AggregateRoot
      {
           public int Id {get;set;}
           ...//simple properties
           public IEnumerable<Foo> Foos
           public IEnumerable<Bar> Bars
           public IEnumerable<FooBar> FooBars
           public SomeOtherEntity Entity
           ...
      }
Run Code Online (Sandbox Code Playgroud)

是否有使用Dapper填充整个对象图的简单方法?

Arn*_*j65 9

我有类似的情况.我让我的sql返回平面,以便所有子对象都返回.然后我使用Query <>来映射完整集.我不确定你的套装有多大.

所以像这样:

var cnn =  sqlconnection();

var results = cnn.Query<AggregateRoot,Foo,Bars,FooBar,someOtherEntity,AggregateRoot>("sqlsomething"
                (ar,f,b,fb,soe)=>{
                    ar.Foo = f;
                    ar.Bars = b;
                    ar.FooBar = fb;
                    ar.someotherentity = soe;
                    return ar;

                },.....,spliton:"").FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)

所以Query标签中的最后一个对象是返回对象.对于SplitOn,您必须将返回视为映射将运行的平面数组.您将为每个新对象选择第一个返回值,以便新映射从那里开始.

例:

select ID,fooid, foo1,foo2,BarName,barsomething,foobarid foobaritem1,foobaritem2 from blah
Run Code Online (Sandbox Code Playgroud)

分裂将是"ID,fooid,BarName,foobarid".当它在返回集上运行时,它将映射它可以在每个对象中找到的属性.

我希望这会有所帮助,并且你的回报设置不会太大而无法恢复平稳.