从 Model .net 核心引用 ApplicationUser

Posted

技术标签:

【中文标题】从 Model .net 核心引用 ApplicationUser【英文标题】:Referencing ApplicationUser from Model .net core 【发布时间】:2022-01-19 23:10:03 【问题描述】:

我正在做一个项目,我有两个对象GroupApplicationUser,引用从GroupApplicationUser。我的 Group 模型有一个属性 CreatedBy 来提供有关创建组的用户的信息。

保存组正确执行,CreatedBy 将 userId 正确存储在数据库中。当我想显示组(对象)列表时会出现此问题。 CreatedBy 属性未被检索,而是具有空值(尽管保存了 userId 值)。

组模型:

public class Group

        public int Id  get; set; 
        public string Name  get; set; 
        public string Descriotion  get; set; 
        public ApplicationUser CreatedBy  get; set; 

组控制器(具有保存和显示方法):

public class GroupController : Controller

    private readonly ApplicationDbContext _db;
    private readonly UserManager<IdentityUser> _userManager;


    public GroupController(ApplicationDbContext db, UserManager<IdentityUser> userManager)
    
        _db = db;
        _userManager = userManager;
    


    [HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<IActionResult> Create([Bind("Id,Name,Descriotion")] Group @group)
    
        string userId = _userManager.GetUserId(User);
        var appUser = _db.ApplicationUser.Find(userId);
        if (!String.IsNullOrEmpty(userId) && appUser != null)
        
            group.CreatedBy = appUser;
        


        if (ModelState.IsValid)
        
            _db.Add(@group);
            await _db.SaveChangesAsync();
            return RedirectToAction(nameof(Index));
        
        return View(@group);
    

    public async Task<IActionResult> Groups()
    
        return View("Groups", await _db.Groups.ToListAsync());
    


应用用户模型:

public class ApplicationUser : IdentityUser

    [NotMapped]
    public string RoleId  get; set; 
    [NotMapped]
    public string Role  get; set; 


    public ApplicationUser()
    
    

集团迁移(模型):

public partial class GroupsModel : Migration

    protected override void Up(MigrationBuilder migrationBuilder)
    
        migrationBuilder.CreateTable(
            name: "Groups",
            columns: table => new
            
                Id = table.Column<int>(type: "integer", nullable: false)
                    .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                Name = table.Column<string>(type: "text", nullable: true),
                Descriotion = table.Column<string>(type: "text", nullable: true),
                CreatedById = table.Column<string>(type: "text", nullable: false),
            ,
            constraints: table =>
            
                table.PrimaryKey("PK_Groups", x => x.Id);
                table.ForeignKey(
                    name: "FK_Groups_AspNetUsers_CreatedById",
                    column: x => x.CreatedById,
                    principalTable: "AspNetUsers",
                    principalColumn: "Id",
                    onDelete: ReferentialAction.Restrict);
            );

        migrationBuilder.CreateIndex(
            name: "IX_Groups_CreatedById",
            table: "Groups",
            column: "CreatedById");
    

    protected override void Down(MigrationBuilder migrationBuilder)
    
        migrationBuilder.DropTable(
            name: "Groups");
    

我的上下文文件

public class ApplicationDbContext : IdentityDbContext

    public ApplicationDbContext(DbContextOptions options) : base(options)
    

    


    public DbSet<ApplicationUser> ApplicationUser  get; set; 
    public DbSet<Group> Groups  get; set; 
    

1.我的模型或任何其他文件有问题吗?如何检索具有CreatedBy 正确值的组对象?

2。有没有更好的方法来设置CreatedBy属性 现在我需要创建ApplicationUser 对象,以便设置属性。 有没有办法只提供 userId(字符串)而不创建 ApplicationUser

string userId = _userManager.GetUserId(User);
var appUser = _db.ApplicationUser.Find(userId);
if (!String.IsNullOrEmpty(userId) && appUser != null)

  group.CreatedBy = appUser;

【问题讨论】:

【参考方案1】:

如果你想看到它,你必须包括用户

public async Task<IActionResult> Groups()

 return View("Groups", await _db.Groups.Include(i=>i.CreatedBy).ToListAsync());

EF Net 5+ 可以隐式创建外键列,但在类中显式包含外键始终是个好主意

public class Group

        public int Id  get; set; 
        public string Name  get; set; 
        public string Descriotion  get; set; 

        public string CreatedById  get; set; 
        public virtual ApplicationUser CreatedBy  get; set; 

这样你的代码会更简单

string userId = _userManager.GetUserId(User);
if ( !string.IsNullOrEmpty(userId))  group.CreatedById = userId;

【讨论】:

我应该为CreatedById使用注释[ForeignKey("ApplicationUserId")]吗? @KazKazar ,不,如果您使用的是 Net5+,则不需要

以上是关于从 Model .net 核心引用 ApplicationUser的主要内容,如果未能解决你的问题,请参考以下文章

从 .net 核心控制台应用程序引用 .net 标准 2.0 库中的 dll 时出错

如何从 .net 核心使用 .net 框架?

[框架]PureMVC--核心层源码

[框架]PureMVC--核心层源码

ASP.NET MVC 的三层架构 + EF数据模型

ASP.NET MVC 的三层架构 + EF数据模型