自定义获取和设置属性

时间:2016-06-06 20:40:57

标签: asp.net asp.net-mvc entity-framework

我正在尝试在我的应用程序中设置产品密钥系统,但我想确保该属性的大小合适(16个字符)。

我尝试了以下

setText()

我想让用户在没有连字符的情况下插入密钥。我上面的代码出现以下错误:

  

表'dbo.ProductKeys'中的列'Value'的类型无效,无法用作索引中的键列。

据我所知,我需要设置Value的限制,以便它可以用作唯一键。但是,_value有一个限制,_value是数据库中Value的实际表示。

在这种情况下,有没有办法正确设置限制?

提前致谢。

1 个答案:

答案 0 :(得分:0)

您收到错误是因为StringLength字段上没有Value属性,数据库列创建为VARCHAR(MAX),不能用作密钥。您需要在该字段上使用[StringLength]作为密钥。但是,当你的getter返回用破折号格式化的键时,你需要密钥长度为19:

public class ProductKey
{
    public const int ProductKeyLength = 19;

    private string _value { get; set; }

    [Key]
    [Required]
    [StringLength(ProductKeyLength, MinimumLength = ProductKeyLength)]
    [Index(IsUnique = true)]
    public string Value
    {
        get
        {
            var temp = Regex.Replace(this._value, ".{4}", "$0-");
            return temp.Trim('-');
        }
        set { this._value = value.Replace("-", ""); }
    }
}

你可能最好在ViewModels和客户端代码中进行格式转换,因为这里有一个问题就是搜索 - 例如......

db.Keys.Add(new ProductKey { Value = "1234-5678-9012-3456" });
db.Keys.Add(new ProductKey { Value = "1234567890123455" });
db.SaveChanges();

Console.WriteLine(db.Keys.Count(k => k.Value.Contains("89")));  // 0
Console.WriteLine(db.Keys.Count(k => k.Value.Contains("8-9"))); // 2