我在查询结果中包含我的身份用户时遇到问题。其他实体都包含在内,无论有多少层深度。
这是我正在使用的模型。
Building * --- 1 City
* *
| /
| /
1 1
ApplicationUser
以及上下文:
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public DbSet<City> Cities { get; set; }
public DbSet<Building> Buildings { get; set; }
}
Building
和City
都具有以下属性:
public Guid ApplicationUserId { get; set; }
public virtual ApplicationUser ApplicationUser { get; set; }
我用来检索数据的查询:
var building = context.Buildings
.Include(c => c.ApplicationUser)
.Include(c => c.City)
.Include(c => c.City.ApplicationUser)
.First();
在结果中,城市填充得很好,但应用程序用户不是。
这可能是命名问题吗?我已经尝试过UserId
/User
和AspNetUserId
/AspNetUser
作为没有成功的属性名称。
我正在使用迁移来创建数据库。为用户创建的表名是 AspNetUsers。
我正在使用实体框架 7 beta 7,不确定这是否也适用于其他版本。
这些是 EF 迁移生成的文件。
ApplicationDbContextModelSnapshot.cs
20150929181902_Init.cs
20150929181902_Init.设计师.cs
(我注意到在生成要上传的文件时忘记包含建筑物>城市关系,但这对于示例来说无关紧要(
我终于想通了。
ApplicationUser
继承自IdentityUser
继承自IdentityUser<string>
。泛型类型用作主键,因此string
!
我将Guid
外键属性更改为 string
s,现在一切正常。
只是为了帮助任何也有类似问题的人。我面临着同样的事情,相同的场景:我的自定义身份用户有一些相关的实体并使用.包含不起作用。他们都不会回来。但他们曾经这样做过。
事实证明,我已经创建了一个自定义的应用程序用户商店,以自动包含我在检索用户时通常总是需要的实体,但我只覆盖了FindByIdAsync方法。当我尝试使用FindByNameAsync时,显然没有实体会回来。只需要覆盖这个和其他 Find 方法。