2016-11-15 3 views
1

私はデータベースに格納し、ユーザーの言語設定を実装しています:Entity Frameworkを使用して文字列プロパティの値の制約を追加することはできますか?

[Table("User")] 
public class User 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int Id { get; set; } 

    public string Language { get; set; } 

    [NotMapped] 
    public CultureInfo Culture => string.IsNullOrWhiteSpace(Language) ? Thread.CurrentThread.CurrentCulture : new CultureInfo(Language); 
} 

はそれができLanguage値を指定することは可能ですか?例えば、"sl-SI"または"hr-HR"または"ru-RU"のみ? ありがとうございます!

答えて

3

たぶん、あなたは、文字列のサポートされている言語と使用ヘルパーの列挙型を作成することができます。

public enum SupportedLanguages 
{ 
    [Description("sl-SL")] 
    Sl, 
    [Description("hr-HR")] 
    Hr, 
    [Description("ru-RU")] 
    Ru 
} 

public static string GetDescription(this Enum value) 
{    
    FieldInfo field = value.GetType().GetField(value.ToString()); 

    DescriptionAttribute attribute 
      = Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute)) 
       as DescriptionAttribute; 

    return attribute == null ? value.ToString() : attribute.Description; 
} 

その後、あなたは、移行時にそれを行う必要があり、この

[Table("User")] 
public class User 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int Id { get; set; } 

    private SupportedLanguages language; 
    public SupportedLanguages Language 
    { 
     get { return language; } 
     set 
     { 
      if(!Enum.IsDefined(typeof(SupportedLanguages), value)) 
       throw new ArgumentOutOfRangeException(); 
      language = value; 
     } 
    } 

    [NotMapped] 
    public CultureInfo Culture => string.IsNullOrWhiteSpace(Language.GetDescription()) ? Thread.CurrentThread.CurrentCulture : new CultureInfo(Language.GetDescription()); 
} 
+0

'ctx.Database.ExecuteSqlCommand("ユーザー(言語)の値(22)に挿入する "))と' user.Language =(SupportedLanguages)22'はどうでしょうか? –

+0

それはエラーを発生させるでしょう – Emad

+0

確かに、あなた自身でそれを試すことができます –

0

のようにこれを使用する:

public override void Up() 
{ 
    Sql("ALTER TABLE Users ADD CONSTRAINT LanguageCnst CHECK (Language in ('sl-SI', 'hr-HR', 'ru-RU'))"); 
} 

public override void Down() 
{ 
    Sql('ALTER TABLE Users DROP CONSTRAINT LanguageCnst'); 
} 

Userにコードを追加:

[Table("User")] 
public class User 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int Id { get; set; } 

    public string Language { get; protected set; } 

    public setLanguage(string value) 
    { 
     if(new[]{"sl-SI", "hr-HR", "ru-RU"}.Contains(value)) 
      Language = value; 
    } 

    [NotMapped] 
    public CultureInfo Culture => string.IsNullOrWhiteSpace(Language) ? Thread.CurrentThread.CurrentCulture : new CultureInfo(Language); 
} 
関連する問題