1

我使用实体框架并拥有一组用户:

 public class DbModel : DbContext
 {
     public DbSet<User> Users { get; set; }

我像这样添加一个用户:

  User UserOne = new User();
  model.Users.Add( UserOne );

我要求用户计数: int userCount = model.Users.Count();

userCount 是“0”,我希望是“1”。添加 DetectChanges 没有帮助。在“model.SaveChanges()”之后,Count = 1,但为时已晚,我需要将内存中的内容与 DB 内容结合起来进行验证。有没有办法做到这一点?

解决方案

使用 Erik Philips 的答案,我为 DbSet 编写了以下扩展方法

public static class DBSetExtentions
{
     public static IEnumerable<T> AllMembers<T>(
         this DbSet<T> target, 
         Func<T, bool> selection
         )  where T : class
    {
        return target.Local.Where(selection).Union(target.Where(selection));
    }
 }

它允许我对所有实体进行选择和验证,例如:

    private void ValidateEmail(ValidationDto validationDto)
    {

        int usersWithSameEmail =
            validationDto.Model.Users.AllMembers(
                x => x.EmailAddress.Equals( EmailAddress ) ).Count();

        if (usersWithSameEmail > 1)
        {
            validationDto.Result.Add(new ValidationResult("Email address is in use"));
        }
    }
4

1 回答 1

3

您可以使用Local将项目(已提交和未提交)的客户端查询到您的数据存储。

var count = model.Users.Local.Count();

需要注意的是,这只是用户的本地表示。这意味着它可能包含来自数据库的部分用户(已更改和/或未更改),以及您创建但未保存的新用户。

有趣的文章 - 在 EF 4.1 第 7 部分中使用 DbContext:本地数据

于 2012-10-29T20:02:42.590 回答