我正在尝试在我的应用程序中设置产品密钥系统,但我想确保该属性的大小合适(16个字符)。
我尝试了以下
setText()
我想让用户在没有连字符的情况下插入密钥。我上面的代码出现以下错误:
表'dbo.ProductKeys'中的列'Value'的类型无效,无法用作索引中的键列。
据我所知,我需要设置Value的限制,以便它可以用作唯一键。但是,_value有一个限制,_value是数据库中Value的实际表示。
在这种情况下,有没有办法正确设置限制?
提前致谢。
答案 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