Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么ApplicationUser中的自定义对象属性为null?_C#_Asp.net_Asp.net Mvc_Entity Framework_Asp.net Mvc 5 - Fatal编程技术网

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) 
}