2012年5月30日 星期三

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 抓一次原始碼就可以了。

還真是奇怪。

Share with Facebook