最近准備把后台管理系統重新設計開發下,使用了bootstrap,在網上找了個漂亮的后台模板:sb2-admin,在使用中遇到了不少問題,總結下,以免以后忘記。
1、EF5利用NuGet升級到EF6后,一些Attribute沖突[未解決]:
我原先的數據驅動使用的是Fluent Nhibernate +Nhibernate+MSSQL2005,本來想玩玩EF的,而且現在新創建的MVC項目模板中,都會自帶EF。因為EF5不支持項目模板生成Code First,所以升級到了EF6,設置到升級以后麻煩來了。“System.ComponentModel.DataAnnotations” 這個命名空間同時存在於2個dll中,原先我的想法很簡單,我不引用就好了,可刪除引用后,還是提示沖突。后來我想可能是webconfig或者package中有問題,可查了半天還是沒有問題。群里的朋友說是緩存的問題,重啟了iisexpress,重啟了電腦,都沒有辦法解決,實在沒有辦法,放棄了EF方式,還是使用了原先的數據驅動。(PS:哪位大俠有解決方案的,可以留言下,主要沖突是TableAttribute等一些標記性特性)
2、FluentNhibernate 不支持存儲過程
一直以為沒有使用FN進行存儲過程的操作,這次因為后台首頁想統計下數據,就利用了存儲過程,但在使用中卻發現FN目前還不支持存儲過程(點擊查看官方),沒有辦法,只能利用Fluent Configuration和HBM Configuration混合的映射方式。
這里要注意的是:
a)存儲過程返回的數據,最好重新定義一個class,並且進行映射(可以使用FN或者HDM方式)
b)把新定義的class和映射的hbm文件,放到你的Model層,這是為了方便以后的管理。
c)映射存儲過程的hdm文件名,以返回類型的名稱命名。(如果返回的class命名為:DataResult,hbm的文件名為:DataResult.hbm.xml)
class:
public class TravelDefaultData { public virtual int UserCount { get; set; } public virtual int OrderCount { get; set; } public virtual int LineCount { get; set; } public virtual int CrusiseCount { get; set; } }
hbm:
<?xml version="1.0" encoding="utf-8" ?> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Travel.Domain" namespace="Bus.Travel"> <sql-query name="GetTravelData"> <return class="TravelDefaultData"> <return-property column="usercount" name="UserCount" /> <return-property column="ordercount" name="OrderCount" /> <return-property column="linecount" name="LinCrusiseCount" /> </return> EXEC [GetTravelData] :userStartDate, :orderStartDate, :lineStartDate, :crusiesStartDate </sql-query> </hibernate-mapping>
TravelDefaultData的映射,可以參考這里。
最后記得配置下混合映射:
var db = Fluently.Configure() .Database(GetSqlConfig()) .Mappings(a => { a.FluentMappings.AddFromAssemblyOf<AreaMap>(); a.HbmMappings.AddClasses(typeof(TravelDefaultData)); }); return db.BuildSessionFactory();
3、在使用Web Api的時候,返回類型序列化沖突:
因為用的新模板很炫,想把數據請求都使用Web Api來進行,但在使用的時候,返回的json數據中,都返回了<字段名>k_BackingField,這下傻了,查看了文檔,說在屬性或者字段標記中,使用DataContactAttribute和DataMemberAttribute,試了以后,發覺還是不行。
后來通過Google后,才知道,原來是SerializableAttribute和DataContractAttribute之間的問題,返回Json數據的時候,使用SerializableAttribute的方式進行序列化了,所以我們必須在Application_Start時,配置下,讓其在序列化的時候,僅僅使用Web Api Json serialization(僅僅支持DataContact和DataMember)。
protected void Application_Start() { AreaRegistration.RegisterAllAreas(); WebApiConfig.Register(GlobalConfiguration.Configuration); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); //配置在webpi的時候,僅僅支持DataContact var serializerSettings =GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings; var contractResolver =(DefaultContractResolver)serializerSettings.ContractResolver; contractResolver.IgnoreSerializableAttribute = true; }
寫在最后
之前一直感覺用百度就足夠了,但現在看來,在技術方面的查詢,還是Google比較給力,這些問題很多都是靠Google解決的。最近因為Vpn到期了,所以一直沒有用Google,最近實在憋不住,重新買了個Vpn,用下來不錯,價格也不貴,大家可以用下:用力敲。可以利用360瀏覽器,進行自動切換模式,很方便。方法點擊查看。