从 Model .net 核心引用 ApplicationUser
Posted
技术标签:
【中文标题】从 Model .net 核心引用 ApplicationUser【英文标题】:Referencing ApplicationUser from Model .net core 【发布时间】:2022-01-19 23:10:03 【问题描述】:我正在做一个项目,我有两个对象Group
和ApplicationUser
,引用从Group
到ApplicationUser
。我的 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的主要内容,如果未能解决你的问题,请参考以下文章