近期開發中遇到的問題總結


最近准備把后台管理系統重新設計開發下,使用了bootstrap,在網上找了個漂亮的后台模板:sb2-admin,在使用中遇到了不少問題,總結下,以免以后忘記。

image

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();

配置以后就能按照NHibernate的方式進行使用了。

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瀏覽器,進行自動切換模式,很方便。方法點擊查看


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM