首页 > 解决方案 > ASP.NET Core Web 应用程序:创建具有默认用户模型作为属性的模型类

问题描述

我使用“ASP.NET Core 3.0 Web 应用程序(模型视图控制器)”模板创建了一个新项目。它带有身份验证(注册、登录、注销等)。

我现在想创建一个名为 InsurancePolicy 的模型类,它具有 User 属性(或 UserId 属性),显然在我的 localdb 的默认 AspNetUsers 表中引用了一个用户。

所以 EFCore 是我理解的建模代码优先,所以我创建了 InsurancePolicy 模型类,具有描述等所有属性。我遵循 Microsoft 的此指南

但是我在 localdb 中没有 AspNetUsers 表的模型类,以便我在保险单上创建一个属性,例如public AspNetUsers User {get; set;}

我该怎么做呢?还是有更好的方法来做到这一点?

我是 Core 的新手,所以代码优先设计而不是 db first 对我来说仍然是模糊的。

更新

看起来 AspNetUsers 表的模型是 IdentityUser。这是真的,还是我仍然迷路?

标签: c#entity-frameworkasp.net-coreef-code-firstlocaldb

解决方案


例如,我将添加模型Book并为身份用户添加外键,一本书属于一个用户:

  1. 创建Book.cs

    public class Book
    {
        public int Id { get; set; }
        public string Name { get; set; }
    
        public string UserId { get; set; }
        public IdentityUser User { get; set; }
    }
    
  2. 修改ApplicationDbContext以包含 DbSet:

    public class ApplicationDbContext : IdentityDbContext
    {
        public DbSet<Book> Books { get; set; }
        public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
            : base(options)
        {
        }
    }
    
  3. add-migration Nameupdate-database在数据库中创建表和关系。

  4. 如果要在控制器中添加属于当前用户的书,可以首先注入服务:

    private readonly ILogger<HomeController> _logger;
    private readonly ApplicationDbContext _context;
    private readonly UserManager<IdentityUser> _userManager;
    public HomeController(ILogger<HomeController> logger, ApplicationDbContext context, UserManager<IdentityUser> userManager)
    {
        _logger = logger;
        _context = context;
        _userManager = userManager;
    }
    
  5. 创建书并保存到数据库:

    Book book = new Book();
    //or search user by FindByIdAsync or FindByEmailAsync
    var user = await _userManager.GetUserAsync(HttpContext.User);
    book.User = user;
    _context.Books.Add(book);
    await _context.SaveChangesAsync();
    
  6. 如果您想阅读具有用户属性的书籍,可以尝试:

    using Microsoft.EntityFrameworkCore;
    
    var result= _context.Books.Include(rt => rt.User).Where(x => x.Id == 1).FirstOrDefault();
    

推荐阅读