Tech・days 2010 デモのフォローアップ 4 POCO 編【T2-305 ADO.NET Entity Framework】

今日はPOCO編のフォローアップです。

 

POCO の特徴や基本的な位置づけについては過去のPOSTをご参考にしてください。

Visual Studio 2010 EF4 POCO Part1

Visual Studio 2010 EF4 POCO Part2

Visual Studio 2010 EF4 POCO Part3

 

  

POCOはご自身でも作成することが可能ですが、自動生成ツールが提供されています。

Visual Studio 2010 RC をご利用の方はツールをダウンロードしてインストールしてください。

POCO Entity Generator (C#)

POCO Entity Generator (VB)

 

さらにPOCO 応用編については株式会社アークウェイ森屋 英治氏のセッションがレベルはグッと上がるもののお勧めです。Tech Days 2010 参加者はストリーミングでご覧いただけるようになると思います。

 

 

T2-305 セッションのデモ

私のセッションではこんな感じのプロジェクトにしました。

 

  キャプチャ

 

ちなみに各プロジェクトの意味合いは次の通り。

dal = Data Access Layer

dl = Domain Layer

pl = Presentation Layer

 

DAL には次のインタフェースを定義しました。

public interface IDal<TEntity> { IEnumerable<TEntity> Read(); Boolean Insert(TEntity item); Boolean Delete(TEntity item); }

 

POCO + Entity Framework の実装はこちら。(デモ用なので細かいところは適当です。すみません)

ポイントはPOCOを使っても従来の Entity と同じように実装可能な点ですね。

※ すべてが同じわけではありません

public class EFDAL_person : IDal<Person> {

    public IEnumerable<Person> Read()     {         schooldbEntities db = new schooldbEntities();         db = new schooldbEntities();         var people = db.People.Include("CourseGrades").ToList();         return people;     }

 

    public Boolean Delete(Person person)     {         schooldbEntities db = new schooldbEntities();         db.AttachTo("People", person);

        var coursegrades = new List<CourseGrade>(person.CourseGrades);

        foreach (var cg in coursegrades)         {             db.CourseGrades.DeleteObject(cg);         }

        db.People.DeleteObject(person);         db.SaveChanges();         return true;     }

 

    public Boolean Insert(Person person)     {         schooldbEntities db = new schooldbEntities();         db.People.AddObject(person);         db.SaveChanges();         return true;     }

}

 

Demo ではストレージを SQL Server から Azure BLOB Storage に切り替えました。

Entity Framework と直接関係ありませんが、Azure BLOB Storage の実装はこんな感じにしました。

ご参考まで。

public class AZSDAL_person : IDal<Person> {     public CloudBlobContainer getBlobContainer()     {         CloudStorageAccount storageAccount = new CloudStorageAccount(             new StorageCredentialsAccountAndKey("myaccount", "mykey"),         new Uri("https://myaccount.blob.core.windows.net/"),         new Uri("https://myaccount.queue.core.windows.net/"),         new Uri("https://myaccount.table.core.windows.net/"));

        CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();         CloudBlobContainer blobContainer = blobClient.GetContainerReference("gradearchive");         bool created = blobContainer.CreateIfNotExist();

        return blobContainer;     }

    public IEnumerable<Person> Read()     {         CloudBlobContainer blobContainer = getBlobContainer();         var list = blobContainer.ListBlobs();

        foreach (var b in list)         {             CloudBlob cb = blobContainer.GetBlobReference(b.Uri.AbsoluteUri);             String xaml = cb.DownloadText();             Person p  = XamlServices.Parse(xaml) as Person;             var coursegrades = new List<CourseGrade>(p.CourseGrades);             ICollection<CourseGrade> new_items = new List<CourseGrade>();

            yield return p;         }     }

    public Boolean Delete(Person person) {         CloudBlobContainer blobContainer = getBlobContainer();         CloudBlob blob = blobContainer.GetBlobReference(person.PersonId.ToString());         return blob.DeleteIfExists();     }

    public Boolean Insert(Person person)     {         CloudBlobContainer blobContainer = getBlobContainer();         CloudBlob blob = blobContainer.GetBlobReference(person.PersonId.ToString());          blob.DeleteIfExists();

        String xml = XamlServices.Save(person);         blob.UploadText(xml);

        blob.Properties.ContentType = "text/xml";         blob.SetProperties();

        return true;     } }

 

以上でPOCOは終了です。

次は最後のSelf-Tracking Entities をご紹介します。