我有一个类似于以下内容的电子邮件:
public class Email
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public string Subject { get; set; }
public string Body { get; set; }
public string From { get; set; }
public DateTime SentOn { get; set; }
public List<string> To { get; set; }
}
为确保唯一性,我在Subject
,From
和SentOn
这就产生了一个问题,当主题超过128个字符时,验证失败。所以我只在它上面添加[MaxLength]
属性。但现在它不能成为关键列
我该怎么办?有没有办法确保唯一性而不是关键?
答案 0 :(得分:3)
如果您使用的是EF 6.1
,则可以使用Multiple-Column Indexes功能:
public class Email
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
[Index("IX_EmailUniqueness", 1, IsUnique = true)]
public string Subject { get; set; }
public string Body { get; set; }
[Index("IX_EmailUniqueness", 2, IsUnique = true)]
public string From { get; set; }
[Index("IX_EmailUniqueness", 3, IsUnique = true)]
public DateTime SentOn { get; set; }
public List<string> To { get; set; }
}
答案 1 :(得分:0)
在此处查看此SO帖子,您可以添加索引以确保唯一性,作为属性或使用EF FluentAPI Setting unique Constraint with fluent API?
请注意,您必须使用 EF6.1 或更高版本。这是MSDN article
修改强>
在检查here和msdn后,看起来PK和索引键的限制为900字节或更少,因此您需要将您的身份用作密钥,并确保其唯一性另一种方式。
举个例子,我尝试手动创建主题列为唯一,长度为4000,我收到了这个错误:
Warning! The maximum key length is 900 bytes. The index 'UQ__Emails__A2B1D9048E9A2A16' has maximum length of 8000 bytes. For some combination of large values, the insert/update operation will fail.
如果您要执行群集密钥选项,则会在创建时收到此警告(并且我在每列上创建了长度为4000)Warning! The maximum key length is 900 bytes. The index 'PK_dbo.Emails' has maximum length of 16012 bytes. For some combination of large values, the insert/update operation will fail.
这实际上意味着几乎所有真实世界条目将失败。
因此,虽然您可以手动绕过128长度限制,但不建议这样做,您很可能会收到错误并丢失数据。并且EF只会让你的密钥长度为128 - 不知道如果你支持它并改变它会怎么做。