C# 为什么ApplicationUser中的自定义对象属性为null?
我创建了一个名为C# 为什么ApplicationUser中的自定义对象属性为null?,c#,asp.net,asp.net-mvc,entity-framework,asp.net-mvc-5,C#,Asp.net,Asp.net Mvc,Entity Framework,Asp.net Mvc 5,我创建了一个名为Person的自定义类来存储姓名、地址等。该类/模型与其他模型交叉引用,包括ApplicationUser: public class ApplicationUser : IdentityUser { public Person Person { get; set; } public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser&
Person
的自定义类来存储姓名、地址等。该类/模型与其他模型交叉引用,包括ApplicationUser
:
public class ApplicationUser : IdentityUser
{
public Person Person { get; set; }
public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
{
// Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
// Add custom user claims here
return userIdentity;
}
}
我的
Person
类也在ApplicationDbContext
中定义:
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public ApplicationDbContext()
: base("MyContext", throwIfV1Schema: false)
{
}
public DbSet<Person> People { get; set; }
}
public类ApplicationDbContext:IdentityDbContext
{
公共应用程序上下文()
:base(“MyContext”,throwifvv1schema:false)
{
}
公共数据库集人物{get;set;}
}
当我检查user
时,我可以看到实体框架填充了对象,因为我看到了用户ID、电子邮件地址、密码哈希等等!一切除了人财产!但是,我可以在数据库中看到相应的行不是null
,而是具有人员的正确ID
我不熟悉ASP.NET/MVC/Entity framework,我读到它默认使用延迟加载。这就是我所经历的吗?如果是这样,我如何告诉实体在Person
属性上使用即时加载?如果没有,我做错了什么?我会让Person类从IdentityUser
或ApplicationUser
继承。然后,在dbcontext类中有以下内容:
DbSet<Person> People {get;set;}
这可能是一个映射问题。实体框架映射太复杂,我无法在这里解释,但我将指出问题所在
确保ApplicationUser
以实体框架可以理解的方式为Person
提供外键属性。实体框架是基于约定的,因此默认情况下,它将在ApplicationUser
类中查找PersonId
属性。如果不想使用默认名称,可以在上下文的OnModelCreating
上使用流畅的配置为其指定自定义名称
我个人认为手动映射所有关系总是一个好主意。下面是一个例子:
public void OnModelCreating(ModelBuilder modelBuilder)
{
builder.Entity<ApplicationUser>().HasRequired(m => m.Person).HasForeignKey(d => d.Person)
}
模型创建时的公共无效(ModelBuilder ModelBuilder)
{
builder.Entity在实体框架代码中,实体框架将第一个整数属性作为主键。因此,在这里,您可以在应用程序用户类中添加Person类的引用。您可以尝试以下操作:
[外键(“人名”)]
公共虚拟人{get;set;}
公共int PersonId{get;set;}
这将使PersonId成为应用程序用户表中的外键。您也可以使其为空
公共int?PersonId{get;set;}
从那里,您可以获取插入到应用程序用户表中的Person对象的Id,然后可以获取Person对象的属性
我希望这可以帮助您映射两个表之间的关系。请确保在方法UserManager.FindById
中指定Person
属性。1)是否已将IDbSet
添加到ApplicationDbContext
?&2)尝试将ApplicationUser.Person属性标记为虚拟(因此代理类可以延迟加载它)。--我觉得DB不知道它是作为一种关系存在的,可能需要使用隐式约定/属性/fluent模型绑定来告诉EF。@BradChristie 1)是的,我在我的ApplicationDbContext
中定义了它。2)我会尝试将它标记为虚拟。或者他可以在ApplicationUser
类中添加Person的所有属性。我的Person
类也被我项目中不一定是ApplicationUser
的其他类使用,因此我将无法从我的t、 好吧,那就行了!我添加了modelBuilder.Entity().hasportional(m=>m.Person);
到我的OnModelCreating
方法,现在它工作了。谢谢你的帮助,@Andrepena!但是,我仍然不明白为什么Entity Framework以前成功地将数据插入数据库,但没有读取它。我想插入也会失败。我很高兴它工作得很好。Entity Framework正确插入数据是因为它确认了Person的存在,而不是它与ApplicationUser的关系。
MyDbContext db = new MyDbContext();
string userid = User.Identity.GetUserId();
var user = db.People.Single(p=>p.Id == userid );
public void OnModelCreating(ModelBuilder modelBuilder)
{
builder.Entity<ApplicationUser>().HasRequired(m => m.Person).HasForeignKey(d => d.Person)
}