Page
クラスのリビジョンを追跡するために、リビジョン ID ( )PageRevision
を継承しPage
て追加するクラスがありますGuid RevisionID;
。
可能であれば、既存のPage
オブジェクトをにキャストPageRevision
し、PageRevision コンストラクターを呼び出して新しいリビジョン ID を作成するにはどうすればよいですか?
Guid を生成し、すべての Page 属性をコピーするコンストラクターを使用することもできますがPageRevision(Page page)
、特にクラスに多くの属性がある場合は自動化したいと考えPage
ています (後で属性を追加し、コピー コンストラクターを変更するのを忘れています)。
希望する用途
Page page = new Page(123, "Page Title", "Page Body"); // where 123 is page ID
PageRevision revision = (PageRevision)page;
// now revision.RevisionID should be a new Guid.
Page
、PageRevision
クラス:
public class Page
{
public int ID { get; set; }
public string Title { get; set; }
public string Body { get; set; }
}
public class PageRevision : Page
{
public Guid RevisionID { get; set; }
public PageRevision()
{
this.RevisionID = Guid.NewGuid();
}
}
フィードバックに基づいて編集:
キャスティングの問題が明らかになったことに加えて(Horse)Animal;
、Jon Skeet は複合リビジョンを推奨しています。
public class PageRevision : Page
{
private readonly Page page;
private readonly Guid id;
public Guid RevisionID { get { return id; } }
public Page Page { get { return page; } }
public PageRevision(Page page)
{
this.id = Guid.NewGuid();
this.page = page;
}
}
ただし、これは私のデータ モデルとはかなり異なるため、この 2 つをできるだけ似たものにしたいと考えています。私のデータベースでは、PageRevisions
テーブルにはテーブルと同じ列がありPages
、余分なRevisionID
列があることを期待しています。これは、データベース トリガーを使用して簡単にバージョン管理できます。
- この複合的なアプローチに照らして、
PageRevisions
にすべてのページ データ ( 、RevisionID
、Title
および) を格納Body
し、Pages
テーブルには URLSlug
とRevisionID
そのテーブルを参照するのみを格納する方が理にかなっているPageRevisions
でしょうか?