从数据库加载自定义 ApplicationUser 对象

Loading custom ApplicationUser object from database

我正在使用 ASP.NET Core 2.0 with Identity 和 Entity Framework。我已将 IdentityUser class 扩展到下面的 ApplicationUser 中:

namespace TxTools.Data.Features.Shared.Models
{
    public class ApplicationUser : IdentityUser
    {
        public string FirstName { get; set; }

        public string LastName { get; set; }
        [ForeignKey("PhotoResourceId")]
        public BlobResource Photo { get; set; }
    }
}

这是我的 BlobResource:

namespace TxTools.Data.Features.BlobStorage.Models
{
    public class BlobResource
    {
        [Key]
        public Guid ResourceId { get; protected set; }
        public string Container { get; protected set; }
        public string MimeType { get; protected set; }
        public string Filename => String.Format("{0}.{1}", ResourceId, MimeTypes.GetExtension(MimeType));
        public BlobResource(string container, string mimeType)
        {
            this.ResourceId = Guid.NewGuid();
            this.Container = container;
            this.MimeType = mimeType;
        }
    }
}

Entity Framework 在我将 BlobResource 添加到 ApplicationUser 时保存了 BlobResource,但我无法让它从数据库加载 BlobResource。该对象始终为空。我已经尝试了几个 Fluent API 命令来尝试加载它,但是 none 工作。

首先,UserBlobResource class 需要相互引用。您需要确定关系是 one-to-one(一个用户一张照片)、one-to-many(一个用户多张照片,还是许多用户一张照片)或 many-to-many。

Entity Framework描述关系的方式在这里:https://docs.microsoft.com/en-us/ef/core/modeling/relationships

其次,EF 是 lazy-loading,因此当您从数据库加载用户时,您必须告诉它追踪这些关系。假设您有一个扩展 IdentityDbContext...

的数据库上下文 class
public class MyContext: IdentityDbContext<ApplicationUser>
{
    public DbSet<ApplicationUser> Users { get; set; }
    public DbSet<BlobResource> BlobResources { get; set; }
}

...您将按如下方式使用 Include

var usersWithBlobs = myContext.Users.Include(user => user.Photo);

或给定其 id 的特定用户:

var myUser = myContext.Users.Where(u => u.Id == id).Include(user => user.Photo);

加载描述如下:https://docs.microsoft.com/en-us/ef/core/querying/related-data