WinFS
資料存放區 > 資料模型 > 型別系統

檔案系統與WinFS之間最大的差異在於WinFS知道其所儲存之每個資料項目的型別。型別會指定資料項目的屬性（property）。WinFS型別系統與.NET Framework的類別與繼承概念緊密關聯。透過延伸與巢狀化任何預先定義的型別，即可建立新型別。
WinFS提供四種預先定義的基礎型別– Items、Relationships、ScalarTypes與NestedTypes。Item是可儲存的基礎資料物件，而Relationship則是兩個資料項目之間的關係或連結。因為所有WinFS項目都必須具有型別，儲存之項目的型別會定義其屬性（property）。Item的屬性可以是ScalarType（定義屬性可包含之資訊的最小單位）或NestedType（多個ScalarTypes和/或NestedTypes的集合）。所有WinFS型別都以.NET CLR 類別的方式提供。
任何以資料單位（例如：連絡人、影像、視訊或文件等）所代表的物件都可以儲存在WinFS存放區中做為Item型別的特殊項。根據預設，WinFS為檔案、連絡人、文件、圖片、音訊、視訊、連絡人與郵件提供Item型別。檔案Item可以儲存任何一般資料，這在檔案系統中是儲存為檔案。但除非為檔案提供進階結構描述（透過將它定義為特殊化的Item），WinFS將無法存取其資料。此類檔案Item僅能支援與其他Item相關聯。
開發人員可以擴充這些型別或基礎型別Item，以為其自訂資料提供型別。Item中包含的資料是以屬性或實際儲存資料的欄位來定義。例如，連絡人Item可能包含型別為ScalarType的Name欄位，以及型別為NestedType（進一步由兩個ScalarType組成）的Address欄位。為定義此型別，會擴充基礎類別Item，而且會新增必要欄位至該類別。NestedType欄位可定義為包含兩個ScalarType欄位的另一個類別。一旦定義型別，就必須定義結構描述以表示每個欄位的原始型別，例如Name欄位的型別是String、Address欄位是自訂的Address類別，每個欄位的型別都是String。WinFS支援的其他原始型別包括Integer、Byte、Decimal、Float、Double、Boolean與DateTime等。結構描述也會定義哪些欄位為必要欄位，哪些欄位為選用欄位。系統會使用以此方式定義的連絡人Item來儲存有關連絡人的資訊，方式是填入屬性欄位並予以儲存。首次儲存時只需要填入標示為必要的欄位。其他欄位可在稍後由使用者填入，或完全不填入。若需要新增多個欄位（例如：“上次交談日期”），只要視需要簡單地擴充此型別即可。您可以使用相同的方式定義其他資料的Item型別。
WinFS會為所有已定義的Item建立資料表。為Item定義的所有欄位會構成資料表的資料欄，而每個對應Item的Item實體則會儲存為資料表的資料列。當資料表中的某些欄位參照某些其他資料表中的資料時，即表示這些資料表之間有特定的關係存在。關係的結構描述會指定相關的資料表有哪些，以及關係的種類與名稱。WinFS執行階段負責管理關係結構描述。所有Item都會公開為.NET CLR 物件，此物件具有統一的介面，可讓應用程式輕鬆存取欄位中儲存的資料。因此，任何應用程式都可以擷取具有任何Item型別的物件，而且可以使用該物件中的資料，而不需要瞭解欄位中儲存之資料的實際結構。
WinFS型別是公開為.NET類別，它可以具現化為.NET物件。透過設定屬性即可在這些型別中儲存資料。完成之後，它們變會永久儲存至WinFS存放區。使用ItemContext類別即可存取WinFS存放區。ItemContext允許以交易式方式存取WinFS存放區，例如，從將ItemContext物件繫結到存放區到因為全部成功而關閉或所有變更都已復原。當資料發生變更時，它們不會寫入到磁碟；而是會寫入到記憶體內的記錄。只有當連線關閉時，變更才會以批次方式寫入磁碟。這樣可協助最佳化磁碟I/O。下列程式碼片段會建立連絡人並儲存在WinFS存放區中。
//Connect to the default WinFS store
 using(ItemContext ic = ItemContext.Open())
 {
     //Create the contact and set the data in appropriate properties
     ContactEAddress contact = new ContactEAddress();

     //Name is a ComplexType
     contact.Name = new PersonName();                  
         contact.Name.Displayname = "Doe, John";
         contact.Name.FirstName = "John";
         contact.Name.LastName = "Doe";

     //Telephone number is a ComplexType
     contact.TelephoneNumber = new TelephoneNumber();  //ComplexType
         contact.TelephoneNumber.Country = CountryCode.Antarctica;
         contact.TelephoneNumber.Areacode = 4567;
         contact.TelephoneNumber.Number = 9876543210;

     //Age is a SimpleType
     contact.Age = 111;

    //Add the object to the user's personal folder.
    //This relates the item with the Folder pseudo-type, for backward
    //compatibility, as this lets the item to be accessed in a folder 
    //hierarchy for apps which are not WinFS native.
    Folder containingFolder = UserDataFolder.FindMyPersonalFolder();
    containingFolder.OutFolderMemberRelationship.AddItem(ic, contact);

    //Find a document and relate with the document. Searching begins by creating an
    //ItemSearcher object. Each WinFS type object contains a GetSearcher() method
    //that generates an ItemSearcher object which searches documents of that type.
    using(ItemSearcher searcher = Document.GetSearcher(ic))
    {
         Document d = searcher.Find(@"Title = 'Some Particular Document'");
         d.OutAuthoringRelationship.AddItem(ic, contact);
    }
    //Since only one document is to be found, the ItemContext.FindOne() method
    //could be used as well.

    //Find a picture and relate with it
    using(ItemSearcher searcher = Picture.GetSearcher(ic))
    {
         Picture p = searcher.Find(@"Occasion = 'Graduation' and Sequence = '3'");
         p.OutSubjectRelationship.AddItem(ic, contact);
    }

    //Persist to the store and close the reference to the store
    ic.Update();
    ic.Close();
 }