ApplicationDbContext中的空dbSet

时间:2015-01-04 23:21:47

标签: c# sql-server asp.net-mvc

在mvc5应用程序中,我在“模型”文件夹中创建类:

public class Code
{
    [Key]
    public Guid Id { get; set; }
    public string UserId { get; set; }
}

进行迁移。

我也上课(上下文,自动生成):

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public ApplicationDbContext()
        : base("DefaultConnection", throwIfV1Schema: false)
    {
    }

    public static ApplicationDbContext Create()
    {
        return new ApplicationDbContext();
    }
    public DbSet<Code> Codes { get; set; }
}

在我的一个控制器中我编写了方法:

using (var db = new ApplicationDbContext())
{
    var manager =
        new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(db));
    var user = manager.FindById(User.Identity.GetUserId());
    Code codeD = new Code();
    codeD.Id = Guid.NewGuid();
    codeD.UserId = user.Id;
    db.Codes.Add(codeD);
    db.SaveChanges();
}

但每当我这样做时,db.Codes得到0项。 enter image description here

但是在我的数据库中保存了更改,我得到了这些项目: enter image description here

有谁知道这种现象的原因?我无法从数据库中获取项目,但我可以免费保存新项目。有人知道,如何从我的数据库获取所有“代码”?

我使用了生成的mvc5项目,因此ApplicationUserDbContext自动生成。

亲切的问候。

2 个答案:

答案 0 :(得分:3)

转而回答未来的搜索者:

在Entity Famework中查看查询结果之前,您必须实现视图。 EF从其大多数方法中返回IQueryableIQueryable实际上是一种允许EF继续构建从db获取所需数据所需的sql的机制。这就是为什么当您在调试视图时,它在查看DbSet时显示类似Select [Columns] From [table] as Extent1的内容。它只是尚未执行的SQL。当您实际尝试从集合中访问属性或对象时,EF会将查询发送到数据库并实现结果。

在大多数情况下,实现结果应该是很自然的。如果您需要用户列表,则应调用ToList()方法以实现结果。如果您只需要一条记录,则应使用FirstOrDefault()方法实现单条记录,如果找不到任何记录,则使用null

示例:

//Materializing a collection of users
public ActionResult Users() 
{
    //The DbContext has been initialized elsewhere
    var users = _db.Users.Where(user => user.IsActive).ToList();

    return View(users);
}

//Materializing a single record
public ActionResult User(int userId)
{
    var user = _db.Users.FirstOrDefault(user => user.Id == userId && user.IsActive);
    if (user == null) return HttpNotFound();

    return View(user);
}

重要的是要注意,EF仅在请求时加载实体可能会导致问题,如果您处置上下文然后尝试访问视图中的结果。这将导致异常,因为没有可以为您加载结果的上下文。

答案 1 :(得分:0)

您可能需要检查 Web.config 文件中是否包含正确的连接字符串。这当然会有所不同,但你应该有以下几点:

<connectionStrings>
  <add name="DefaultConnection" connectionString="Data Source=.\;Initial Catalog=MyDatabaseName;Integrated Security=True" providerName="System.Data.SqlClient" />
</connectionStrings>