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