![](/img/trans.png)
[英]General usage approach for EntityFrameworkCore DatabaseFirst by not scaffolding in C#.NET
[英]C# .NET core 3 MVC Scaffolding with EntityFrameworkCore
我必須遵循多對多 model 結構:
public class User
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid UserId { get; set; }
[Required]
[MaxLength(50)]
public string Name{ get; set; }
[Required]
[MaxLength(50)]
public string Email { get; set; }
public virtual ICollection<UserInRole> UserInRoles { get; set; }
}
public class Role
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int RoleId { get; set; }
public string RoleName { get; set; }
public virtual ICollection<UserInRole> UserInRoles { get; set; }
}
public class UserInRole
{
[Required]
public Guid UserId { get; set; }
[Required]
public int RoleId { get; set; }
public virtual User User { get; set; }
public virtual Role Role { get; set; }
}
應用程序上下文:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
// UserInRole: set both fields as primary
modelBuilder.Entity<UserInRole>().HasKey(table => new{ table.RoleId, table.UserId});
modelBuilder.Entity<User>()
.HasMany(c => c.UserInRoles);
modelBuilder.Entity<Role>()
.HasMany(c => c.UserInRoles);
使用正確的關系(多對多)成功創建了數據庫,但是當我創建一個新的 Controller 並使用腳手架查看時 - 系統生成 CRUD 頁面,沒有 select 選項的每個用戶的角色。 正常嗎? 我需要自己做這部分嗎?
是的,據我所知,您應該在視圖中手動渲染一對多關系。
我知道的最簡單的方法之一:
<div class="form-group">
<label asp-for="User" class="control-label"></label>
<select asp-for="UserId"
class="form-control"
asp-items="@(new SelectList(ViewBag.Users, "UserId", "Name"))">
</select>
</div>
<div class="form-group">
<label asp-for="Role"></label>
<select asp-for="RoleId"
class="form-control"
asp-items="@(new SelectList(ViewBag.Roles, "RoleId", "RoleName"))">
</select>
</div>
在此示例中,您通過ViewBag將UsersList和RolesList作為SelectList發送到 View,然后在 View 上呈現它們。 據我所知,您需要手動執行以呈現一對多或多對多關系,因為需要將列表轉換為SelectList以便視圖知道如何使用它。
你也可以看看這里
要創建 select 控件,首先您必須從角色列表中創建一個 SelectItem 列表:
var roleItems=dbcontext.Roles.Select(i=> new SelectListItem {
Value=i.RoleId.ToString(),
Text=i.RoleName
}).ToArray();
您可以使用 viewbag 來保留視圖的列表,但最好像這樣創建 ViewModel class
public UserViewModel
{
public User User {get; set;}
public SelectListItem[] RoleItems {get; set;}
}
在此之后,您可以使用此列表創建 select 輸入。 您可以使用來自@Miraziz 答案的示例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.