2012-02-24 18 views
4

私はのアイテムタイプのサブモデルイベントを制約する以下のデータモデルを持っています。各ItemTypeにはイベントの有効なセットがありますが、これはItemEventテーブルに制限されています。例えば、ビデオは{再生、停止、一時停止}、画像のサイズ変更{保存、共有}などが可能です。エンティティをモデル化してコンパイル時にデータモデルの制約を強制する方法はありますか?

enter image description here

私が使用したイベントは、特定の項目のために有効であることをタイム保証をコンパイル得ることができるようにエンティティモデルでこの制約を反映するための最良の方法は何ですか?それは、開発者は、彼らが望む任意のItemEventで文字列を渡すことができますillustrate--ちょうどしようと、

public void AddItemEventLog(Item item, string ItemEvent) 
{ 
    // 
} 

は明らかに、これは不自然な例である。具体的には、私はAddItemEventLogメソッドをリファクタリングしています。 ItemEvent resultsetに基づいて列挙を作成しても、開発者がItemEvent.ResizeのアイテムをVideoに渡すのを防ぐために、エンティティモデルには何もありません。

私はビデオの基本クラスとしてItemを持っていますが、私は列挙型をオーバーライドしようとしましたが、今は不可能であることが分かりました。私はDBがFK違反を起こしたときに既に例外をスローするので、実行時にイベントの有効性をチェックするのはあまり興味がありません。私は、可能な場合は、時間をコーディングに芽でそれをニップしたい:)

は現在、このしかし、任意の変更をすることのようにモデル化するクラスがあります。

//enums.cs 
public enum ItemType : byte 
{ 
    Video = 1, 
    Image = 2, 
    Document = 3 
} 

//item.cs 
public class Item : BaseModel 
{ 
    public int ItemId { get; set; } 
    public ItemTypeLookup.ItemType ItemType { get; set; } 
    public string ItemName { get; set; } 
} 

//video.cs 
public class Video : Item 
{ 
    public string Width { get; set; } 
    public string Height { get; set; } 
    public string Thumb { get; set; } 
} 
+0

Entity Frameworkを使用していますか? –

+0

いいえ、Entity Frameworkを使用していません –

+0

テーブルごとに1つのモデルクラスを作成していますか? –

答えて

2

を私はCode Contractsが何かを強制する唯一の方法であり得ることだと思いますこのようにコンパイル時に。コンパイル時以外のチェックでは、正しい機能を確保するために単体テストを書くことが次善策です!

関連する問題