首先是EF6代码中的唯一多列

时间:2014-10-17 19:58:49

标签: c# entity-framework ef-code-first database-indexes

我有一个类似于以下内容的电子邮件:

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; }
}

为确保唯一性,我在SubjectFromSentOn

上制作了复合键

这就产生了一个问题,当主题超过128个字符时,验证失败。所以我只在它上面添加[MaxLength]属性。但现在它不能成为关键列

我该怎么办?有没有办法确保唯一性而不是关键?

2 个答案:

答案 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 - 不知道如果你支持它并改变它会怎么做。