1

由于没有任何方法可以在当前最新的 EF 版本中为实体添加唯一约束,所以我想出了一个主意。(我知道可以通过嵌入 SQL 添加约束)

我在我的 Repository 类中添加了一个方法:

private IDbSet<T> Entities;

public virtual bool Contains(Func<T, bool> predicate)
{
        return Entities.Any(t => predicate(t));
}

我认为这将取代我目前的重复预防逻辑:

bool already exists = (from t in someSet.Entities 
                       where t.UniqueColumn == entity.UniqueColumn select t).
                       FirstOrDefault() != null;

if(alreadyExists)
throw new Exception("Entity already exists in DB.");

这是一个好主意,防止重复插入/更新数据库的最佳方法是什么?

编辑:我编辑了 Contains 方法以使用谓词。现在我可以写这样的代码:

if(repository.Contains(t=> t.Email == "someemail@email.com")
     throw new Exception("Email already exists.");
4

3 回答 3

3

如果这将是一种罕见的情况,那么在数据库上放置唯一约束然后捕获在您尝试插入现有记录时生成的异常并没有错。

如果这很可能发生很多,那么我仍然会将约束放在数据库上,但请照常进行检查。

FWIW,您应该使您的方法采用 anExpression<Func<T, bool>>以便查询不会转换为 Enumerable。

于 2012-05-05T18:05:51.837 回答
2

好吧,这行不通,因为您需要声明要强制执行唯一性的内容。在主键上?在“用户名”之类的其他列上?在 User.EMail 列上,但前提是它不为空(因此您可以同时拥有多个用户的空电子邮件)?

我更喜欢这样的事情是明确的。所以我实际上更喜欢你以前的逻辑。

于 2012-05-05T16:05:06.087 回答
0

在 DB 中强制唯一性的最佳方法是使用唯一约束

于 2012-05-05T16:11:18.663 回答