AutoMapper使用筆記

2021-06-19 02:09:22 字數 3227 閱讀 7267

主要用途

領域物件與dto之間的轉換、資料庫查詢結果對映至實體物件。

使用筆記

場景1:源型別blogentry,目標型別blogpostdto,指定屬性進行對映(blogentry.id對應於blogpostdto.postid)。

**: .formember(dto => dto.postid, opt => opt.mapfrom(entity => entity.id));

場景2:idatareader對映至實體類

**:

using (idatareader reader = _db.executereader(command))

}

場景3:列表型別之間的對映,比如:源型別list,目標型別list

**如下:

注:必須要先通過createmap建立blogsite與blogsitedto的對映關係。

場景4:在對映時為目標例項的屬性指定值

**如下:

var blogsitedto = new blogsitedto();

.formember(dto => dto.blogsitedto, opt => opt.usevalue(blogsitedto));

注:blogsitedto是blogpostdto的乙個屬性。

補充:我們遇到的場景是乙個複雜的實體類,有很多屬性,資料庫操作是乙個跨資料庫查詢,查詢的字段遠遠少於實體類的屬性。

對於跨資料庫查詢,我們沒有找到通過linq to entities實現的方法,於是就用dbset.sqlquery呼叫儲存過程進行查詢,**如下:

using

(blogdbcontext context

=new

blogdbcontext())

,@entryid=

", blogid, entryid);

blogentry entry

=context.blogentries.sqlquery(sql).single();

}

雖然不能使用linq進行查詢,但我們不想在這裡拋棄這個新式**,不能發射飛彈,可以用一下機關槍嘛。於是,如上面的**所示,用sqlquery進行查詢,用entity framework完成查詢結果與實體類的資料對映。

結果發現,entity framework是依賴於實體類的屬性進行對映的。如果把entity framework比作機關槍,那實體類的屬性就是子彈,每顆子彈只能攻擊唯一對應的目標,在射擊過程中,只要有一顆子彈攻擊的目標不存在,機槍就會卡殼(子彈決定目標?)。也就是entity framework會在idatareader中查詢每個實體類屬性對應的值,而我們的應用場景卻是「查詢的字段遠遠少於實體類的屬性」,這時,entity framework成為了一堆廢鐵(這個說法不妥,可以通過modelbuilder.entity().ignor忽略不需要對映的字段,但是,如果不同的查詢返回的字段不同,這個方法就不管用了)。

為什麼不由目標決定子彈?出現什麼目標,用什麼子彈,既節省子彈,又不會卡殼。也就是根據查詢結果給對應的實體類屬性賦值。難道這個新式**也有設計缺陷,沒有考慮到這樣的應用場景?還是我們不會使用?

翻來覆去地擺弄它,還是沒搞定,只能換**...

「輕量級」果然名不虛轉,簡單易用,針對性強,我們用它輕鬆解決了問題,**如下:

sqlcommand command 

=(sqlcommand)_sqldb.getstoredproccommand(

"[blog_entry_get]");

command.parameters.addwithvalue(

"@blogid

", blogid);

command.parameters.addwithvalue(

"@entryid

", entryid);

using

(idatareader reader

=_sqldb.executereader(command))

}

但感覺缺少乙個功能entity to sqlparamentcollement  

//todo:可考慮使用下面的方法替換上面相關類

public static tresult executescalar2(database db, dbcommand dbcommand, tentity entity) where tentity : class

public static listconverttolist2(idatareader dr) where t : class, new()

t o = new t();

foreach (var p in properties)

p.setvalue(o, value, null);}}

}list.add(o);

}return list;

}public static t converttoentity2(idatareader dr) where t : class,new()

p.setvalue(o, value, null);}}

}return o;

}private static propertyinfo getproperties() where t : class

", t.fullname);

memorycache cache = memorycache.default;

if (cache[key] == null)

return cache[key] as propertyinfo;

}private static dbparameter getdbparameters(t entity) where t : class

", p.name);

sqlparameter.value = p.getvalue(entity, null);

sqlparameter.dbtype = getdbtype(p.propertytype);

parameterlist.add(sqlparameter);

}return parameterlist.toarray();

}private static listgetcolumnnames(idatareader dr)

return list;

}private static dbtype getdbtype(type t)

return dbtype;

}

AutoMapper使用筆記

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!主要用途 領域物件與dto之間的轉換 資料庫查詢結果對映至實體物件。使用筆記 場景1 源型別blogentry,目標型別blogpostdto,指定屬性進行對映 blogentry.id對應於blogpostdto.postid 場景2 idata...

AutoMapper使用筆記

主要用途 領域物件與dto之間的轉換 資料庫查詢結果對映至實體物件。使用筆記 場景1 源型別blogentry,目標型別blogpostdto,指定屬性進行對映 blogentry.id對應於blogpostdto.postid 場景2 idatareader對映至實體類 場景3 列表型別之間的對映...

AutoMapper 使用實踐

一.使用意圖 從我開發過程使用到一些場景 實體 實體 集合 集合 實體欄位名稱不同 實體資料型別不同 相同名稱,相同資料型別無需配置 三.最佳實踐 專案結構 每個專案用途,解決方案資料夾基本標示清楚。2.以訂單為例 不是真實業務,只是舉個簡單的例子 在models 實體類庫 新增ordermodel...