天天看點

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

最近準備把背景管理系統重新設計開發下,使用了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();      

配置以後就能按照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浏覽器,進行自動切換模式,很友善。方法點選檢視。

郵箱:[email protected]

QQ:785418

微信:jamesying1

QQ群:376248054 通關:cnblogs

技術改變生活,技術改變人生!用技術來創造價值,擁有技術,不僅僅是開發,您将獲得更多!如果您覺得我能幫到您,您可以通過掃描下面二維碼來【捐助】我!

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

繼續閱讀