Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# EF6 codefirst中唯一的多列_C#_Entity Framework_Ef Code First_Database Indexes - Fatal编程技术网

C# EF6 codefirst中唯一的多列

C# EF6 codefirst中唯一的多列,c#,entity-framework,ef-code-first,database-indexes,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

我有一封班级邮件,看起来像:

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; }
}
公共类电子邮件
{
[数据库生成(DatabaseGeneratedOption.Identity)]
公共int Id{get;set;}
公共字符串主题{get;set;}
公共字符串体{get;set;}
来自{get;set;}的公共字符串
公共日期时间SentOn{get;set;}
要{get;set;}的公共列表
}
为了确保唯一性,我在
主题
From
SentOn

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


我该怎么办?有没有一种方法可以在不作为键的情况下确保唯一性?

查看这篇文章,您可以添加索引以确保唯一性,作为属性或使用EF FluentAPI

注意:您必须使用EF6.1或更高版本。这是你的电话号码

编辑:

在检查了一下PK和msdn之后,看起来PK和索引键的限制是900字节或更少,所以您希望使用您的标识作为键,并以另一种方式确保唯一性

例如,我尝试手动创建长度为4000的唯一主题列,但出现以下错误:

警告!最大密钥长度为900字节。索引“UQ\uuuuuuua2b1d9048e9a2a16”的最大长度为8000字节。对于某些大值组合,插入/更新操作将失败。
如果要执行聚集键选项,则在创建时会收到此警告(我将每列的长度设置为4000)
警告!最大密钥长度为900字节。索引“PK_dbo.Emails”的最大长度为16012字节。对于某些大值组合,插入/更新操作将失败。
这实际上意味着几乎所有现实世界的条目都将失败


因此,虽然您可以手动绕过128长度限制,但不建议这样做,您很可能会出现错误并丢失数据。EF只允许您拥有128个密钥长度-不确定如果您在其后面更改它会做什么。

如果您使用的是
EF 6.1
,您可以使用以下功能:

公共类电子邮件
{
[数据库生成(DatabaseGeneratedOption.Identity)]
公共int Id{get;set;}
[索引(“IX_emailunique”,1,IsUnique=true)]
公共字符串主题{get;set;}
公共字符串体{get;set;}
[索引(“IX_emailunique”,2,IsUnique=true)]
来自{get;set;}的公共字符串
[索引(“IX_emailunique”,3,IsUnique=true)]
公共日期时间SentOn{get;set;}
要{get;set;}的公共列表
}

it仍然抱怨无法成为关键列:(确保唯一性的一个选项是获取要保持唯一性的属性的散列,并将其用作唯一列,或者(性能较差)在存储之前检查收集。我可以发送两封主题相同的不同电子邮件。如果
SentOn
具有毫秒精度,那么
From
SentOn
就足够了。在我的情况下,From不应该是NVarChar(MAX)也这样做,但当我生成初始配置(添加迁移)时,Up()迁移方法仅为第一列生成索引:。索引(t=>t.XXXXX,unique=true,名称:“ÏX_XXXX”)当我对字符串属性/列执行此操作时,EF给出以下错误:表“dbo.Patients”中的列“Email”的类型无效,无法用作索引中的键列。
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; }
}