在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项。
但是在我的数据库中保存了更改,我得到了这些项目:
有谁知道这种现象的原因?我无法从数据库中获取项目,但我可以免费保存新项目。有人知道,如何从我的数据库获取所有“代码”?
我使用了生成的mvc5项目,因此ApplicationUserDbContext自动生成。
亲切的问候。
答案 0 :(得分:3)
转而回答未来的搜索者:
在Entity Famework中查看查询结果之前,您必须实现视图。 EF从其大多数方法中返回IQueryable
。 IQueryable
实际上是一种允许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>