2017-01-27 7 views
2

Entity Frameworkでエンティティのプロパティの値を制限します。例えばEntity Frameworkの列の値を制限する方法はありますか?

public class Position: EntityBase 
{ 
    [AnAtribute("Values:1,2,3")] 
    public int Status { get; set; } 
    public string ReferenceCode { get; set; } 
    public string Location { get; set; } 
    public string Content { get; set; } 
} 

値も列挙型から来ることができます。

この表では、Statusの列に値を設定できます。 1、2、または3です。そうでない場合、EFは例外をスローします。

私はStatusテーブルを作成し、すべてのステータスをもちろん定義できます。しかし、私はいつもそのテーブルに参加したくありません。それはオプションではありません。

+1

試みたが、あなたのような何かを行うことができますので、あなたはプロパティに範囲の検証を持つことができません。 [範囲(1、3、ErrorMessageResourceName = "eGreaterThanZero"、 ErrorMessageResourceType = typeof演算(リソース)) ] –

+0

これをプロパティの属性として追加してください。 –

+0

私の答えを確認してくださいこれはwhtを探していると思います –

答えて

1

プロパティをEnumにし、その列挙型を定義します。

public enum Status 
{ 
    SomeStatusA = 1, 
    SomeStatusB = 2, 
    SomeStatusC = 3, 
} 
public class Position: EntityBase 
{ 
    public Status Status { get; set; } 
    public string ReferenceCode { get; set; } 
    public string Location { get; set; } 
    public string Content { get; set; } 
} 

また、それがデータベースに当たったときの範囲外にあるステータス値を更新/追加することを防ぐことになる(あなたは1を持って言及した)ステータステーブルの上にforeign key constraintを追加することができます。

+0

そして、私は4つのステータスプロパティに4を割り当てることはできません。 –

+0

@ SergeyBerezovskiy - 私はほとんどあなたができることを知っています:)。それは実際に値がどこから来ているかによって異なります(つまり、開発者がハードコーディングされた場合、enumの型の1つを強制的に使用するように強制されますが、バインドされていればすべてのベットはオフです)。 – Igor

+0

@SergeyBerezovskiy私は範囲の検証属性でそれを行うことができました。 –

1

必要なものはCHECK CONSTRAINTです。 SQLでは、このようにテーブルを変更します

ALTER TABLE Position 
    ADD CONSTRAINT CK_Position_Status CHECK (Status IN (1, 2, 3)) 

これは現在EFで直接サポートされていません。私。チェック制約付きのテーブルを生成したり、既存のテーブルを変更したりするための属性や設定はありません。しかし、あなたは、移行中に手動で、このような制約を追加することができます(それが可能な場合)

migrationBuilder.Sql(@"ALTER TABLE Position 
    ADD CONSTRAINT CK_Position_Status CHECK (Status IN (1, 2, 3))"); 

はまた、私はステータスフィールドの列挙型の代わりに整数を使用することをお勧めいたしますでしょう。したがって、どの値が有効であるべきか、そうでないと推測されることはありません。

1

私はこれを試してみました.Dbに保存しても、検証エラーが出ます。これが有用かどうか確認してください。

public class RangeTest 
{ 
    [Key] 
    [Range(1, 3)] 
    public int ProjectId { get; set; } 

} 

enter image description here

関連する問題