2012年12月26日 星期三

New transaction is not allowed because there are other threads running in the session

問題

在使用 Entity Framework 5.0 查詢並新增資料時,發生了這樣的例外

New transaction is not allowed because there are other threads running in the session

原因

經 Google 大神的查訪後,這篇告訴我們,原來當資料筆數多時,原來的connection 尚未 close,程式卻可能執行到新的 SaveChange 了,而引發新的 transaction。

例如

var payments = from i in _context.Payments
               select i;
foreach (var payment in payments)
{
    ...
    _context.SaveChanges();
}

解法

只要簡單的強迫 ToList(),將資料先查詢出來即可

var payments = (from i in _context.Payments
               select i).ToList();
foreach (var payment in payments)
{
    ...
    _context.SaveChanges();
}

Html5 常用 Tag

HTML5 New Tags

HTML5 新增了許多 Tag,這些Tag 部份著重在語意上。因此,什麼場景使用什麼Tag顯的相當重要。但UI看起來並沒有差異,故大部份的開發人員其實不太重視。
以下是我的翻譯,翻的不好請見諒。

header

header : The header element represents a group of introductory or navigational aids. 一群由簡介文或輔助瀏覽的元素。

section

section : The section element represents a generic section of a document or application. A section, in this context, is a thematic grouping of content, typically with a heading. 章節元素表達一個文件或應用程式的一個一般的章節。一個章節,通常有個標題,對其內的內容做簡單的專題。

section 的目的,通常用來製作成大綱(outline)。因此不要用 section 來作為套用樣式的手段。如果目的只是套用樣式,就使用 div  即可。

hgroup

hgroup: the heading of a section. The element is used to group a set of h1h6 elements when the heading has multiple levels, such as subheadings, alternative titles, or taglines. section 通常有個標題。若標題由 h1 ~ h6 組成,則 hgroup 將這些 h1~h6 內挑出一個最高等級做為此 section 的大綱。

如下例,hgroup 內含了h1, h2,則該section 會以h1的文字作為 outline

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
</head>
    <body>
        <h1>The Body</h1>
        <section>
            <hgroup>
                <h1>H1</h1>
                <h2>H2</h2>
            </hgroup>
        </section>
    </body>
</html>

image

nav

The nav element represents a section of a page that links to other pages or to parts within the page: a section with navigation links。一個由一組連結組成的章節。

article

The article element represents a self-contained composition in a document, page, application, or site and that is, in principle, independently distributable or reusable, e.g. in syndication. This could be a forum post, a magazine or newspaper article, a blog entry, a user-submitted comment, an interactive widget or gadget, or any other independent item of content. article 是一個獨立的組合,因此將 article 獨立出來或移到別的地方,都不會讓該 article 失去意義。

一個簡單的方式辨別 article 是否為適當的 tag,就是檢視該內容是否適合作為 RSS 的文章。

aside

The aside element represents a section of a page that consists of content that is tangentially related to the content around the aside element, and which could be considered separate from that content. Such sections are often represented as sidebars in printed typography. 支援性的文章。不看 aside 的內容並不影響對整個內容的了解。通常用於註解或廣告。

footer

The footer element represents a footer for its nearest ancestor sectioning content or sectioning root element. 包含章節結束的資訊。例如作者資訊,相關文章連結, copyright data。

2012年12月25日 星期二

EDMX 中,Entity Container Name 與 Namespace 必須不同名稱

EDMX 可以 compile ,卻出現 Error 10001:The symbol 'Entities' has already been defined.

同事來信問了這個問題。使用 entity framework 4.0,整個類別庫可以編譯,但 edmx 會出現如上的錯誤。

image

打開該專案,真的有這個問題。以 xml 來檢視時,也出現了下面的錯誤。

image

解法

上圖中,Schema Namespace (Entities) 與 EntityContainer Name(也是 Entities) 相同,會不會是名稱衝突啊?試著將其中一個改名後,果然解了這個問題。

至於為什麼會發生has already been defined.這樣的訊息嘛,看來 EntitySet 的 Name 與對應的EntityType 是指不同的東西,而NameSpace 與 EntityContainer 同名稱,會讓EntitySet 與 EntityType 同名,造成 edmx 內部名稱的衝突,因此發生錯誤。但此問題並非程式碼的 namespace 問題,因此 compile 會成功

2012年12月22日 星期六

實用的 HTML5 Outliner

Html5

開發 Html5 網頁時,常常沉淪在 UI 的視覺效果、功能的實作、資料庫的存取效能等看的出來的「需求」,卻忘了 Html5 的一個 Outline (大綱)特色。

大綱功能的出現,可以幫助瀏覽器快速的掌握該網頁的主要架構,有助於 SEO(搜尋引擎最佳化),甚至讓瀏覽器快速地呈現出網頁。因此,了解自己的網頁大綱是否正常,是一個必須面對的課題。

要了解大綱,就去看一看 Html5 的 spec 吧。

工具

有沒有實用的小功具可以幫助我們來檢查網頁的大綱呢?Google Chrome 上有個 extension:

https://chrome.google.com/extensions/detail/afoibpobokebhgfnknfndkgemglggomo

以 yahoo 新聞首頁來 check 一下吧。好像不錯啊!

image

檢查我自己在開發的網站一下。

SNAGHTML418bc80

哦!不妙!快點修改吧!Untitled …代表有大綱章節(section)卻沒有章節名稱(section name),就好像一本書的目錄( table of content)出現一堆的(未命名)一樣醜。誰也不看這樣的書吧。

參考

  1. HTML5的文檔大綱 : 寫的很詳細。懶惰的我,是寫不出這樣的好文章的。
  2. HTML5 語意標籤(SEMANTICS)與大綱(OUTLINE

2012年11月8日 星期四

jQuery Validation Plugin 1.9 預設忽略 hidden elements 的檢核

今早要實作一個功能,需要使用 ASP.NET MVC 的 HiddenFor 對 Model 作 validation,卻發現沒有作用?

我首先是在 VS2012 上使用 MVC4 作的。

Model

public class TestModel
  {
    [Required]
    public string Name { get; set; }
  }
 
 

而 cshtml 也是異常的簡單

@model MvcApplication2.Models.TestModel

@{
        ViewBag.Title = "TestHidden";
}

@using (Html.BeginForm()) {
        @Html.ValidationSummary(true)

        <fieldset>
                <legend>TestModel</legend>

                <div class="editor-label">
                        @Html.LabelFor(model => model.Name)
                </div>
                <div class="editor-field">
                    @Html.HiddenFor(m => m.Name)
                        @Html.ValidationMessageFor(model => model.Name)
                </div>

                <p>
                        <input type="submit" value="Create" />
                </p>
        </fieldset>
}

<div>
  @Html.ActionLink("Back to List", "Index")
</div>
@section Scripts{
  @Scripts.Render("~/bundles/jqueryval")
}

然而,ASP.NET MVC validation 就是不會檢查。

怪的是,同樣地程式碼,使用 ASP.NET MVC 4 在 VS2010 上卻會檢查??

比較兩方的差異,除了 .net framework 版本不同之外,就是 javascript library 的版本不同了。

再 check 一下,發現只要把 jQuery validation 1.9 換成 1.8 的版本,就正常了。Bingo!!

原來在 jQuery validation 1.9 release note 上有提到

Another change should make the setup of forms with hidden elements easier, these are now ignored by default (option “ignore” has “:hidden” now as default).

所以,不管是 <input type=’hidden’ />, 或者是 <input style=’display:none’ /> 都不再會被檢核。

那要如何在 jQuery validation 1.9 上運作正常呢?幸好還是有解的

$.validator.setDefaults({ ignore: [] });

20121120 附註:

在:hidden 的區塊中,以 jQuery 使用 data 設定 data-val 屬性並沒有作用。試驗的結果,必須使用 $(selector).attr(‘data-val’, false) 來動態開啟/關閉 jQuery validation 對單一輸入的檢核。

2012年11月2日 星期五

換了 SSD 之後,一切都順多了

image

如上圖。這是我從公司內部網路複製大檔案時的狀況。注意到瓶頸應該是網卡,所以右方的 Network 到達了 98%。

而檔案的複製速度(左方)應該是維持水平。這樣才是正常的。

在換 SSD 之前,瓶頸竟然是 Disk??

討論見 http://www.plurk.com/p/he6xm9 

建議有相同問題的苦主都應該去換換。

SNAGHTML37aafde

在 同一SSD 間複製大檔案,也應該有不錯的寫入速度。

2012年10月26日 星期五

Stat Counter


http://gs.statcounter.com/ 列出了我們軟體業界常常在問的趨勢。

例如 「行動裝置」比一般電腦使用率更高了嗎?結果是還差的很遠http://gs.statcounter.com/#mobile_vs_desktop-ww-monthly-201109-201209

Windows 7 很普及了嗎?是
http://gs.statcounter.com/#os-ww-monthly-201109-201209

甚至可以看到台灣區的瀏覽器版本。(IE 6.0 只剩1.06% 的使用率)
http://gs.statcounter.com/#browser_version-TW-monthly-201109-201209

是一個不錯的網站

2012年10月15日 星期一

ASP.NET MVC unobtrusive Cheat Sheet

需要一個 client side 的 JavaScript validation library. 而使用 ASP.NET MVC 當然最好使用 jQuery.validate.unobtrusive.js,雖然還是有一點不好用啦!
然而每次都要到 google 找資料也是很累,不如自己做一個清單好了。

    說明
  data-val true, false 是否要驗證
長度限制 data-val-length 字串 字串長度不符合時的錯誤訊息
  data-val-length-max 整數 字串最大長度
  data-val-length-min 整數 字串最小長度
必填 data-val-required 字串 未填入時的錯誤訊息
RegEx data-val-regex 字串 錯誤訊息
  data-val-regex-pattern 字串 regex
數字 data-val-digits 字串 錯誤訊息。只接受數字字元。
  data-val-number 字串 錯誤訊息。只接受數字(正負)
日期 data-val-date 日期 錯誤訊息。只接受日期。
Email data-val-email 字串 錯誤訊息
Url data-val-url 字串 錯誤訊息
範圍 data-val-range 字串 錯誤訊息
  data-val-range-min 整數  
  data-val-range-max 整數  
比較 data-val-equalto 字串 錯誤訊息
  data-val-equalto-other 驗證項目的name  
驗證訊息 data-valmsg-for 驗證項目的name 驗證訊息
附檔名限制 data-val-accept 字串 錯誤訊息
  data-val-accept-exts 字串 Ex: “jpg|gif|png”

範例見黑大的 使用jQuery.validate.unobtrusive.js

動態驗證的 JavaScript

self.save = function() {
        var form = $('#editForm');
        form.removeData("validator");
        $.validator.unobtrusive.parse(form); 
        form.validate();
        if (form.valid()) {
          var url = form.attr('action');
          var postData = form.serialize()
            + "&field1=" + self.field1();
          $.post(url, postData, function(data) {
            if (data.IsOk) {
              alert("已儲存");
            } else {
              alert(data.Message);
            }
          });
        }
      };

2012年10月11日 星期四

[Knockout] 解決 radio checked binding,radio button 老是要按兩次才能選取的的問題

這次問題的過程比較難以描述。

初始問題

問題 sample 如下

http://jsfiddle.net/CharlesLin/X2a5P/

當點選 radio button 時,一開始會點不順利,直到每點過一次以才會正常.

image

checked 只能 binding 到  string

查詢http://knockoutjs.com/documentation/checked-binding.html 中有提到下面這一段敘述

•For radio buttons, KO will set the element to be checked if and only if the parameter value equals the radio button node’s value attribute. So, your parameter value should be a string

意思是:當使用 checked 繫結時,必須是 string 才有用.

所以,就有了第二個版本:把 Id 改成 string

http://jsfiddle.net/CharlesLin/X2a5P/3/

image

這樣子就正常了.

我的解法

然而,將 Id 改型別是不合常理的。通常這些資料都是從伺服器端來的,並非我們能控制。最好在 client 能夠正常運作。
最後,只能修改 binding

http://jsfiddle.net/CharlesLin/X2a5P/4/

image

將 value 改成字串。改正 one-way binding 不影響此處值的顯示。

如此就符合我的需求了

2012年10月8日 星期一

Knockout.js

這是一個關於 Knockout.js 的 sample code 及 投影片。

個人對於 knockout.js 的未來潛力相當看好,是一個可以與 jQuery 爭輝的 JavaScript Library。

Sample Code 及投影片可以到這裡下載。

2012年9月11日 星期二

@Scripts.Render("~/bundles/jqueryval") 引用次數要剛剛好一次

在執行 ASP.NET MVC ajax 新增資料時,發生了重覆 insert的事情。

為什麼呢?原來是重複引用了 @Scripts.Render("~/bundles/jqueryval"). (在 View 中用了一次,在 layout page 中又一次 )

產生的 html code 如下

<script src="/App/Scripts/jquery.unobtrusive-ajax.js" type="text/javascript"></script>
<script src="/App/Scripts/jquery.validate.js" type="text/javascript"></script>
<script src="/App/Scripts/jquery.validate.unobtrusive.js" type="text/javascript"></script>

兩次會有什麼效果呢?就是執行一次Request,結果會出現2次的 Request. 如下圖所示。

SNAGHTML4eedc9

如果該引用這些 js 而忘了引用呢?不會發生 javascript error, 反而像是沒有 client side validation 一般,只出現 server side 的 validation。

這種現象好奇怪,在開發時很難想到是js 引用次數的問題。

2012年7月3日 星期二

五個雲端計算解決方案的本質

現在常常看到廣告都說自己是「雲端」了,連一般的網站都說自己已經雲端化了。到底一般的網站與雲端有什麼不同呢?

今天看了一段話,覺得應該是個較貼切的解答。

five “essential” characteristics of cloud computing solutions, including on-demand self-service, broad network access, resource pooling, rapid elasticity, and measured service. These attributes enable the agility and cost savings expected from cloud solutions.

以下是自己不成才的翻譯與註解

五個雲端計算解決方案的本質

  1. 自助式服務:自己要多少個,只要自己線上操作,就可以增加多少。不必等!(如果還需要填申請表,就不是雲端)
  2. 網路存取:寬頻且容易存取 ,透過標準網路通訊的方式提供給各平台使用。
  3. 資源集區:與容錯能力有關 。大量可自由分配運用的實體或虛擬的資源。
  4. 快速彈性:能快速反應。例如增加一個 Web Server,應該在很短的時間內(如5分鐘)就可以取得。
  5. 量化的服務:計算費用的。 可量測的使用量。

2012年6月15日 星期五

Visual Studio 2012 Test Platform

在 VS 2010 中寫單元測試,是一件簡單的事,但是內建的 ms-test 的效能卻是不好。而其他的 test framework 如 xUnit, MbUnit, NUnit 等,又難與 Team Foundation Server 整合。於是,只能一直使用 ms-test。

在 VS 2012 中,Test Framework 不再是單元測試中第一個要選擇的對象了。因為它有了新的概念:Unit Test Platform。

Unit Test Platform

簡單來說,我們現在可以在 VS12 中作許多不同Test Framework 的單元測試平台了。

image

安裝 xUnit Test Runner

在 Extensions and Updates 中,找到 xUnit Test Runner 並安裝。

image

image

接下來,建立一個平常的 Class Library, 並用 NuGet 安裝 xNnit ,以及引用 ms test framework. 完成如下圖的  References

image

再來,就寫測試吧。

   1: using System;
   2: using System.Collections.Generic;
   3: using System.Linq;
   4: using System.Text;
   5: using System.Threading;
   6: using Microsoft.VisualStudio.TestTools.UnitTesting;
   7: using Xunit;
   8:  
   9: namespace ClassLibraryTest
  10: {
  11:     [TestClass]
  12:     public class Class1
  13:     {
  14:         [Fact]
  15:         public async void Test()
  16:         {
  17:             var sut = new AsyncClass();
  18:             await sut.DoAsyncWork();
  19:             Xunit.Assert.Equal("Hello", sut.Property);
  20:         }
  21:  
  22:         [TestMethod]
  23:         public void Test2()
  24:         {
  25:             Microsoft.VisualStudio.TestTools.UnitTesting.Assert.IsTrue(true);
  26:         }
  27:     }
  28: }

執行測試

在左方的 Test Explorer,就可以看兩種不同的 Test Framework 的測試都可以被找到,且測試完畢。

image

結論

VS 2012 中的測試,看來又大幅提升了微軟在測試界的地位了。

Windows Azure 開發要下載的工具

下載

Windows Azure SDK

 

Azure Storage Explorer

看 storage 用。

Windows Azure Platform Management Tool (MMC)

另一個 storage 的管理工具。

2012年6月6日 星期三

一定要用Windows 8 的理由

最近開始使用 Windows 8 Release Preivew,發現它實在好用。

我是在 ASUS Zenbook 上安裝的。由於是 SSD,故原本的 Windows 7 開機就很快了。為了試用 Windows 8,特地安裝成 vhd 並以 vhd 當成開機。
換句話說,這已經是個虛擬技術下的測試結果了。但試用的結果仍相當滿意。

以下說明為何建議使用 Windows 8。(持續增加中…)

開機超快

Windows 8 開機實在有夠快。原本 Windows 7 開機到登入畫面,至少還要等個兩秒。使用 Windows 8 開機,彷彿沒關過電腦一樣快。這對平板(Tablet)電腦來說是必備的。

支援多螢幕工作區

除了可以連接多螢幕外,現在還可以在每個螢幕上都有工作列,獨立的桌面。
桌面背景圖案還可以跨螢幕,不過,這需要一張超寬的像片才有效果。

Hyper-V

Windows 7 的 Windows Virtual PC 只能安裝32位元的作業系統,不支援快照的重大限制,導致相當多人不想用。Windows 8 現在內建 Hyper-V,可跑64位元的虛擬環境,支援快照,遷移…等功能。
實在是太棒了。我的Windows 8 已經是使用 vhd 的虛擬技術開機的了,竟然還可以在裡頭再安裝 Hyper-V。(在虛擬環境中再虛擬一個環境??)

Movie App 播放自動暫停/繼續

當 Movie App 被切換到其他 App 時,原有播放中的影片會自動暫停。如果從其他App切回來時,被暫停的 App 會自動再播放。這種行為只有在行動裝置才有,現在也搬到 Windows 8上,讓 桌機/筆電/平板/手機 的使用者體驗一致。

虛擬光碟

記得 Windows 7 時,我還找過 Virtual CloneDrive 用來虛擬光碟。現在 Windows 8 除了可以將 iso 檔燒成實體光碟外,也可以掛載成虛擬光碟了。

image

App

網路 + 瀏覽器已經讓我們的視野無限延伸了,為什麼還要有 App 呢?因為設計精良的 App,可以讓我們有更好的使用者經驗。尤其在大小不一的行動裝置上,使用者操作習慣與介面更相形重要。

Windows 8 上已經有許多 App 了。當然也有好的與不好的。微軟在設計 App 時就有相當多的考量。例如 Mail App,設計過程可以參考 Building the Mail app  這個 blog。

放大縮小

桌面也可以放大縮小字型及圖示了了。身為上流的作業系統,這一定是必備的。

image

2012年5月30日 星期三

使用非管理員權限來部署 ASP.NET 應用程式

系統交付給客戶後,系統是有保固時間的。當程式有 bug,就需要更新程式。如果程式更新都要請客戶自己部署,那之後就要讓客戶使用起來方便。
而要請使用管理員權限來部署 ASP.NET 應用程式,就很可能被質疑,如果客戶程度夠的話。

因此需要一個可以使用非管理員權限來部署 ASP.NET 應用程式的方式。

目前使用 IIS 7.

建立更新帳號

只需要一般帳號即可。以下以 smartDeployer 為例

image

安裝/設定 IIS

如果沒有安裝 IIS,就照著下圖做。如果已經安裝了,就要看看哪些功能未被勾選。

image

image

 

image

image

Web Management Server 是一定要裝的。上圖少勾選了。Windows Authentication 不用裝(上圖有誤) 。

image

安裝 .NET Framework 4.0

記得安裝  .net framework 4.0 及  sp1。如果需要的話

安裝 Web Deploy tool V2.1

我們靠的就是 Web Deploy Tool,目前的版本是 2.1。記得在要部署的伺服器上,要完整安裝。

image

設定 Web Management Service

clip_image002

Web Management Server 必須靠 Basic 驗證。故需要啟用。

clip_image003

clip_image005

檢查 Enable remote connections (1)是否已經勾選(應已勾選)。若沒有勾選,請先按右方的「Stop」(2)鍵後,勾選「Enable remote connections」 ,再 Start(3)鍵。

clip_image007

授權

我們要授權 smartDeployer 可以在 Default Web Site 更新

clip_image009

clip_image010

最後按 Setup

clip_image011

防火牆

記得打開防火牆,port  8172

以上就完成了網頁伺服器的設定

部署

使用 Visual Studio 2010 打包後的 指令不能用。經明察暗訪後,需修改指令如下

"C:\Program Files (x86)\IIS\Microsoft Web Deploy V3\\msdeploy.exe" -source:package='Package.zip' -dest:auto,computerName='https://serverNameOrIp:8172/MSDeploy.axd?site=Default%20Web%20Site',userName='domainUser',password='password',authtype='Basic',includeAcls='False' -verb:sync -disableLink:AppPoolExtension -disableLink:ContentExtension -disableLink:CertificateExtension -setParamFile:"Parameters.xml"  -whatif  -allowUntrusted:true

參考

Configuring a Web Server for Web Deploy Publishing (Web Deploy Handler)

JSON 未被定義

客戶抱怨出現了下面的 javascript 錯誤。

JSON 未被定義

原因

IE 7 以下的IE版本, 執行 jQuery 執行 ajax 時會發生此錯誤。

解法

步驟1:使用 NuGet 加入  json2

image

步驟2: 加上如下的 javascript (我使用的是  ASP.NETMVC)

 

<script type="text/javascript">
    if (typeof (JSON) == 'undefined') { 
      $('head').append($("<script type='text/javascript' src='@Url.Content("~/Scripts/json2.js")'>"));
    }
  </script>

2012年5月23日 星期三

Visual Studio 2010 中,MSTest 執行測試時,AppDomain.CurrentDomain.BaseDirectory 的值會隨測試設定不同而改變

今天在寫單元測試時,發現了長久來覺得怪界的現象。這次一定要解開這個謎團

問題:AppDomain.CurrentDomain.BaseDirectory 的值會不同

步驟1:

建立一個測試專案,並在測試中加上

Console.WriteLine(AppDomain.CurrentDomain.BaseDirectory);
結果是
image
當程式需要讀取同目錄的檔案,例如 xml 檔案時,這是合理的。但在 MSTest 中,檔案會複製到 TestResults\xxxxx\Out 目錄下,(xxxxx 是與時間相關的目錄名稱)
步驟2:
將測試設定的選項Deployment 勾選
image
image
再執行測試一次。結果與步驟1相同。

步驟3:

關掉 Visual Studio 2010後再執行 Visual Studio 2010,重新執行該測試。竟然結果不一樣了!!

image

結論

雖然想寫單元測試,但這個結果未免也太不單元了。與環境相關,算不算是整合測試呢?

2012年5月11日 星期五

如何在 Entity Framework 4.3.1 上使用 enum

使用 Entity Framework 來存取資料實在是很方便,但如果要用 enum 時就不能 work  了。

Entity Framework 5.0 支援 Enum

在尚未上市的 VS11 中,就直接支援了 enum。當然需要用  NuGet 安裝  Entity Framework

image

public class AuditLog
  {
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }
    [Required]
    public string Account { get; set; }
    [Column("AuditTime")]

    public DateTime Date { get; set; }
    [MaxLength(10)]
    public string GroupName { get; set; }

    public int FunctionId { get; set; }

    public AuditStatus Status { get; set; }

    public override string ToString()
    {
      return string.Format("Id={0}, Account={1}, Date={2}, GroupName={3}, FunctionId={4}, Status={5}", Id, Account, Date, GroupName, FunctionId, Status);
    }
  }

  public class BasicContext : System.Data.Entity.DbContext
  {
    public BasicContext(string dbName)
      : base(dbName)
    { }

    public DbSet<AuditLog> AuditLogs { get; set; }
  }

  public enum AuditStatus
  {
    Success,
    Fail
  }

呼叫的方式也非常簡單,就與一般 c# 沒差。

static void Main(string[] args)
    {
      Database.SetInitializer<BasicContext>(new DropCreateDatabaseIfModelChanges<BasicContext>());
      using (var context = new BasicContext("DbName"))
      {
        bool isCreated = context.Database.CreateIfNotExists();
        Console.WriteLine(isCreated);
        var audit = new AuditLog() { Account = "E", Date = DateTime.Now, FunctionId = 1, Status = AuditStatus.Fail };
        context.AuditLogs.Add(audit);
        context.SaveChanges();

        var q = from i in context.AuditLogs
                select i;
        foreach (var auditLog2 in q)
          Console.WriteLine(auditLog2);
      }
    }

產生得資料庫如下圖

image

Entity Framework 4.3.1 的方式

相同的程式,在  4.3.1 版以前是沒有作用的。 Entity Framework 對不支援的欄位,就視而不見,因此相同的程式,在資料庫中就是看不到 Status 的欄位。

有沒有什麼變通方法嗎?有! 只需要改一下屬性存取方式即可。程式如下

public int StatusValue { get; set; }

    public AuditStatus Status
    {
      get { return (AuditStatus)StatusValue; }
      set { StatusValue = (int) value; }
    }

程式寫作時,是透過  Status 來存取,但 Entity Framework 看不懂 AuditStatus 欄位,因此就不理 Status 欄位了。取而代之,是產生 StatusValue 欄位

結果如下

image

 

如果想要產生 Status 欄位呢?再變通一下

[Column("Status")]
    public int StatusValue { get; set; }

    [NotMapped]
    public AuditStatus Status
    {
      get { return (AuditStatus)StatusValue; }
      set { StatusValue = (int) value; }
    }
上述的屬性(Attribute) 告訴 entity framework,Status 這個 enum Property 不必理會。而 StatusValue 這個 int Property 要對應到資料表的 Status 欄位。

2012年5月3日 星期四

IE 的市佔率逐年流失

IE 目前只剩下50%上下而已了。

Chrome 不斷的增加。FireFox 也稍微下降。
這大概與版本更新的速度有關吧。IE 版本更新的速度實在太慢了。

參考 http://www.netmarketshare.com/browser-market-share.aspx?qprid=1 

結論

寫網站的開發人員們,必須測試不同瀏覽器的相容性了。

2012年4月25日 星期三

常用的軟體

以下是我常用的軟體(會不斷更新)

作業系統

SkyDrive
使用檔案總管就可以使用了 25GB 的免費空間,只需要一個  live id

Microsoft Office
這就不多說了。

CCleaner
修復作業系統問題及清除硬碟空間

Windows Virtual PC
在 Windows 7 上的虛擬機。目前幾乎全改到 Windows Server 2008 的 Hyper-V 上。

Microsoft Security Essentials
在 Windows 7 上如果有打開 UAC 的話,我認為只需要簡單的防毒即可。

程式開發

Microsoft All-In-One Code Framework
所有的微軟平台相關的 code sample,支援搜尋,篩選。

Reflector
觀看及反組譯 .NET Assembly

Live Writer
Windows Live Essentials 的一部份。此部落格都是用這個軟體撰文的。

瀏覽器
IE 9, FireFox, Google Chrome, Opera. 幾乎全裝了。

LocalDb
SQL Server Express 雖然是免費的版本,但仍然是伺服器等級的資料庫。那開發人員用的資料庫並不需要如此高的等級。 LocalDb 是一個簡化版本的 SQL Server Express,非常適合開發人員。未來 VS11 也預定會安裝 LocalDb。

 

系統維運

Log Parser Lizard GUI
我主要用來分析IIS log, 但該工具功能還真是多呢!

Remote Desktop Connection Manager
一次可遠端連線到多台伺服器。網管必備。

2012年4月10日 星期二

TF293000: 在下列工作項目欄位的資料倉儲偵測到資料衝突

緣由

使用了 Scrum template 後,就發生了下面的錯誤。

image

原因

兩個 TeamProjectCollection所使用的欄位定義不同,會導致 建立 Cube 時無法建立 dimesion。

例如我的 TFS 的 DefaultCollection 的 System.State , Name (用來作為 friendly name) 與另一個 Team Collection 定義的不同。(又是中文化的問題)

SNAGHTML836395(In DefaultCollection)

 image(Another TeamProjectCollection)

解決方法

將兩者欄位定義改成一致即可。以上為例

witadmin changefield /collection:http://tfsserver:8080/tfs/collection1 /n:System.State /name:狀況

參考

http://msdn.microsoft.com/zh-tw/library/ee921480.aspx#

http://msdn.microsoft.com/en-us/library/dd236909.aspx

PS

下面是我所下的指令,可以做為參考

witadmin changefield /collection:http://tfsserver:8080/tfs/rsi /n:System.Title /name:標題
witadmin changefield /collection:http://tfsserver:8080/tfs/rsi /n:System.State /name:狀況
witadmin changefield /collection:http://tfsserver:8080/tfs/rsi /n:System.State /name:狀況
witadmin changefield /collection:http://tfsserver:8080/tfs/rsi /n:System.Reason /name:原因
witadmin changefield /collection:http://tfsserver:8080/tfs/rsi /n:System.AssignedTo /name:指派給
witadmin changefield /collection:http://tfsserver:8080/tfs/rsi /n:Microsoft.VSTS.Scheduling.RemainingWork /name:剩餘工作
witadmin changefield /collection:http://tfsserver:8080/tfs/rsi /n:Microsoft.VSTS.Common.Activity /name:活動
witadmin changefield /collection:http://tfsserver:8080/tfs/rsi /n:Microsoft.VSTS.Build.IntegrationBuild /name:整合組建
witadmin changefield /collection:http://tfsserver:8080/tfs/rsi /n:Microsoft.VSTS.Common.Severity /name:嚴重性
witadmin changefield /collection:http://tfsserver:8080/tfs/rsi /n:Microsoft.VSTS.Build.FoundIn /name:發現於
witadmin changefield /collection:http://tfsserver:8080/tfs/rsi /n:Microsoft.VSTS.Common.Priority /name:優先權
witadmin changefield /collection:http://tfsserver:8080/tfs/rsi /n:Microsoft.VSTS.Common.Issue /name:問題
witadmin changefield /collection:http://tfsserver:8080/tfs/rsi /n:Microsoft.VSTS.Common.ActivatedDate /name:啟動日期
witadmin changefield /collection:http://tfsserver:8080/tfs/rsi /n:Microsoft.VSTS.Common.ActivatedBy /name:啟動者
witadmin changefield /collection:http://tfsserver:8080/tfs/rsi /n:Microsoft.VSTS.Common.ClosedDate /name:關閉日期
witadmin changefield /collection:http://tfsserver:8080/tfs/rsi /n:Microsoft.VSTS.Common.ClosedBy /name:關閉者
witadmin changefield /collection:http://tfsserver:8080/tfs/rsi /n:Microsoft.VSTS.Scheduling.StartDate /name:開始日期
witadmin changefield /collection:http://tfsserver:8080/tfs/rsi /n:Microsoft.VSTS.Scheduling.FinishDate /name:完成日期
witadmin changefield /collection:http://tfsserver:8080/tfs/rsi /n:Microsoft.VSTS.TCM.AutomationStatus /name:自動化狀態
witadmin changefield /collection:http://tfsserver:8080/tfs/rsi /n:Microsoft.VSTS.Common.StackRank /name:堆疊順位

2012年3月15日 星期四

Solution 無法再 Go Online 了

今天不知何時開始,我的 Solution 再也無法 Go Online 了。每次按Go Online 就會出現下面的畫面。

但 Team Explorer 仍然運作正常呢.

image

解決方法很簡單:將 Solution 所在目錄全刪除了,再從 TFS 抓一次原始碼就可以了。

還真是奇怪。

2012年2月25日 星期六

經典錯誤訊息

如下圖。

如果硬要翻譯成中文的話,大概會是「產出錯誤報告時在顯示此錯誤時發了錯誤」。

image

2012年2月23日 星期四

2012/02 電腦語言排行:Object-C 超強

http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html

這個月最新的排行出來了。很久沒看了說。

Object-C (iPad, iPhone, iPod 的官方語言) 竟然衝到了第5名。市場真現實。

C# 也到了第3名。

clip_image002

Share with Facebook