如何在EF CodeFirst中使用唯一约束

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在EF CodeFirst中使用唯一约束相关的知识,希望对你有一定的参考价值。

参考技术A 使用唯一约束的两种方式:

方式1 自定义唯一约束

[AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = true)]
public class UniqueAttribute : ValidationAttribute

public override Boolean IsValid(Object value)

//校验数据库是否存在当前Key
return true;



View Code

在Model类中使用

public class Email

[Key]
public int EmailID get; set;

public int PersonId get; set;

[Unique]
[Required]
[MaxLength(100)]
public string EmailAddress get; set;
public virtual bool IsDefault get; set;
public virtual Boolean IsApprovedForLogin get; set;
public virtual String ConfirmationToken get; set;

[ForeignKey("PersonId")]
public virtual Person Person get; set;


View Code

EF Codefirst 验证唯一属性?

【中文标题】EF Codefirst 验证唯一属性?【英文标题】:EF Codefirst validate unique property? 【发布时间】:2011-02-06 17:16:49 【问题描述】:

对如何有效地验证 CodeFirst 模型的给定属性是否唯一感到好奇。经典示例是成员的用户名或显示名称。

传统上,我可以通过在数据库中设置唯一约束来做到这一点,或者在尝试插入操作期间进行查找。我知道如何在生成后手动将这些东西添加到数据库中,只是想看看是否有办法将其作为框架提供的架构映射的一部分。

更新 我发现我可以覆盖 DbContext 上的 ValidateEntity 方法,这在概念上允许我进行查找然后使对象无效以防止保存。我仍然很想知道是否有办法在数据库中应用唯一约束或类似的约束

【问题讨论】:

【参考方案1】:

Code First(以及一般的 EF)仍然 本身并不支持唯一约束。在this post 中,我展示了一种创建它们的方法,同时您的数据库由 Code First 创建(通过自定义 Initializer 类中的 SQLCommand 方法),但它与手动创建它并没有真正的不同。另一种方法是您建议的ValidateEntity,但无论如何我仍会在数据库上创建唯一约束。

【讨论】:

【参考方案2】:

我已在 code project

上发布了相关信息

一般来说,这取决于您放在类上的属性来生成唯一索引

【讨论】:

以上是关于如何在EF CodeFirst中使用唯一约束的主要内容,如果未能解决你的问题,请参考以下文章

EF CodeFirst 创建唯一性约束

EF Core 中是不是有用于唯一约束的数据注释(代码优先)?

EF6 codefirst 中的唯一多列

Entity Framework 6 Code First 方法 - 唯一约束不起作用

EF Core 迁移:在存在时删除唯一约束

实体框架中多列的唯一键约束