简体   繁体   English

从 Model .net 核心引用 ApplicationUser

[英]Referencing ApplicationUser from Model .net core

I'm working on a project and I have two objects Group and ApplicationUser with a reference from Group to ApplicationUser .我正在做一个项目,我有两个对象GroupApplicationUser ,其中引用了GroupApplicationUser My Group model has a property CreatedBy to provide the info about the user who created the group.我的Group model 有一个CreatedBy属性来提供有关创建组的用户的信息。

Saving a group is executed correctly, CreatedBy propery storing userId in the database.保存组正确执行, CreatedBy将 userId 正确存储在数据库中。 The issue happens when I want to display a list of Group (objects).当我想显示组(对象)列表时会出现此问题。 The CreatedBy property isn't being retrieved, instead it has null value (despite saved userId value).未检索CreatedBy属性,而是具有 null 值(尽管保存了 userId 值)。

Group Model: Model 组:

public class Group
{
        public int Id { get; set; }
        public string Name { get; set; }
        public string Descriotion { get; set; }
        public ApplicationUser CreatedBy { get; set; }
}

Group Controller (has save and display methods): Controller组(有保存和显示方式):

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

}

ApplicationUser Model:应用用户 Model:

public class ApplicationUser : IdentityUser
{
    [NotMapped]
    public string RoleId { get; set; }
    [NotMapped]
    public string Role { get; set; }


    public ApplicationUser()
    {
    }
}

Migration for the Group (model):集团迁移(模型):

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

My Context file我的上下文文件

public class ApplicationDbContext : IdentityDbContext
{
    public ApplicationDbContext(DbContextOptions options) : base(options)
    {

    }


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

1. Is there something wrong in my Models or any other files? 1. 我的模型或其他文件有问题吗? How to retrieve Group object with CreatedBy correct value?如何使用CreatedBy正确值检索组 object?

2. Is there a better way to set CreatedBy property Right now I need to create ApplicationUser object, in order to set the property. 2.有没有更好的方法来设置CreatedBy属性现在我需要创建ApplicationUser object,以便设置属性。 Is there a way just to provide userId (string) without creating ApplicationUser ?有没有办法只提供 userId (字符串)而不创建ApplicationUser

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

You have to include user if you want to see it如果你想看到它,你必须包括用户

public async Task<IActionResult> Groups()
{
 return View("Groups", await _db.Groups.Include(i=>i.CreatedBy).ToListAsync());
}

EF Net 5+ can create a foreign key column implicetly, but it is always good idea to include foreign key to the class explicetly EF Net 5+ 可以隐式创建外键列,但最好将外键包含到 class 显式

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

this way your code would be more simple这样你的代码会更简单

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM