自定义获取和设置属性



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

我尝试了以下方法

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

}

我想使用户能够插入带有不带连字符的密钥。我在上面的代码中收到以下错误:

表 'dbo' 中的"值"列。产品密钥的类型不能用作索引中的键列。

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

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

提前谢谢。

您会收到错误,因为Value字段上没有 StringLength 属性,数据库列将创建为不能用作键的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

最新更新