首页 文章

如何将Identity dbcontext与应用程序上下文合并?

提问于
浏览
0

我无法从Application Identity Users读取数据 . 我是初学者,任何想法?编译时没有错误 . 但我无法添加新任务 .

我在创建任务时遇到错误https://localhost:44312/usertasks/Create

问题出在GET方法上,但用户lis不为空

  • 结果视图展开结果视图将枚举IEnumerable

  • [0] {lukas@wp.pl} UserTaskTest.Models.ApplicationUser AccessFailedCount 0 int ConcurrencyStamp "785f9a54-e7f1-4e3b-8bad-55165155d631" string Email "lukas@wp.pl" string EmailConfirmed false bool ExecutedUserTasks null System.Collections.Generic.ICollection Id "53f416ab-aa1e-465f-9dd4-dc32e11914ae" string LockoutEnabled true bool LockoutEnd null System.DateTimeOffset? NormalizedEmail "LUKAS@WP.PL"串NormalizedUserName "LUKAS@WP.PL"串OwnedUserTasks空了System.Collections.Generic.ICollection PasswordHash "AQAAAAEAACcQAAAAEIqkXlzky+4i8BsPl5Z4524B3Dj3u0RZMY2Rf5ch5l22GEMj5m0LsVgeWDAavmVO+g=="串******中国空字符串PhoneNumberConfirmed假布尔SecurityStamp "698529ad-c47c-40f9-bdf3-c4d946cda86a"串TwoFactorEnabled假布尔用户名"lukas@wp.pl"串

  • [1] {li@wp.pl} UserTaskTest.Models.ApplicationUser AccessFailedCount 0 int ConcurrencyStamp "1a9064e2-3cc9-4794-9198-81423a5d8cd2" string Email "li@wp.pl" string EmailConfirmed false bool ExecutedUserTasks null System.Collections.Generic.ICollection Id "970839dc-31be-4966-8f06-e664aca3622c" string LockoutEnabled true bool LockoutEnd null System.DateTimeOffset? NormalizedEmail "LI@WP.PL"串NormalizedUserName "LI@WP.PL"串OwnedUserTasks空了System.Collections.Generic.ICollection PasswordHash "AQAAAAEAACcQAAAAEM2KiwEfRDomBNiWXHmEtvwWEodfZDb8eaSADOGP2ZralzlnBDZEMQIsOvTk1nHMcw=="串******中国空字符串PhoneNumberConfirmed假布尔SecurityStamp "0a829111-88d7-4a8a-b65d-5582cecbe67f"串TwoFactorEnabled假布尔用户名"li@wp.pl"串

System.NullReferenceException:未将对象引用设置为对象的实例 . 在Microsoft.AspNetCore.Mvc.Rendering.MultiSelectList.GetListItemsWithValueField()在Microsoft.AspNetCore.Mvc.Rendering.MultiSelectList.GetListItems()在Microsoft.AspNetCore.Mvc.Rendering.MultiSelectList.GetEnumerator()

public class UserTask
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int UserTaskID { get; set; }

    public string Description { get; set; }

    [ForeignKey("OwnerUserID")]
    public string TaskOwnerId { get; set; }

    [ForeignKey("ExecutorUserID")]
    public string TaskExecutorId { get; set; }

    public virtual ApplicationUser OwnerUserID { get; set; }
    public virtual ApplicationUser ExecutorUserID { get; set; }

}


public class ApplicationUser : IdentityUser
{
     public ICollection<UserTask> OwnedUserTasks { get; set; }
     public ICollection<UserTask> ExecutedUserTasks { get; set; }
}

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{

    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options)
    {
    }

    public DbSet<UserTask> UserTask { get; set; }


    protected override void OnModelCreating(ModelBuilder builder)
    {
       base.OnModelCreating(builder);

       builder.Entity<ApplicationUser>()
           .HasMany(x => x.OwnedUserTasks)
           .WithOne(x => x.OwnerUserID);

       builder.Entity<ApplicationUser>()
           .HasMany(x => x.ExecutedUserTasks)
           .WithOne(x => x.ExecutorUserID);
    }
}

Startup.cs

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddDbContext<ApplicationDbContext>(options =>
            options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

        services.AddIdentity<ApplicationUser, IdentityRole>()
            .AddEntityFrameworkStores<ApplicationDbContext>()
            .AddDefaultTokenProviders();

        // Add application services.
        services.AddTransient<IEmailSender, EmailSender>();

        services.AddMvc();
    }
}

UserTaskControler

public class UserTasksController : Controller
{
    private readonly ApplicationDbContext _context;
    private readonly UserManager<ApplicationUser> _userManager;

    public UserTasksController(ApplicationDbContext context, UserManager<ApplicationUser> userManager)
    {
        _context = context;
        _userManager = userManager;
    }

    public IActionResult Create()
    {
        ViewData["TaskOwnerId"] = new SelectList(_userManager.Users.ToList(), "Id", "Name");

        ViewData["TaskExecutorId"] = new SelectList(_userManager.Users.ToList(), "Id", "Name");

        return View();
    }
}

和观点

@model UserTaskTest.Models.UserTask

@{
    ViewData["Title"] = "Create";
}

<h2>Create</h2>

<h4>UserTask</h4>
<hr />
<div class="row">
    <div class="col-md-4">
        <form asp-action="Create">
            <div asp-validation-summary="ModelOnly" class="text-danger"></div>
            <div class="form-group">
                <label asp-for="Description" class="control-label"></label>
                <input asp-for="Description" class="form-control" />
                <span asp-validation-for="Description" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="TaskOwnerId" class="control-label"></label>
                 <select asp-for="TaskOwnerId" class="form-control" asp-items="ViewBag.TaskOwnerId"></select>
            </div>
            <div class="form-group">
             <!--   <label asp-for="TaskExecutorId" class="control-label"></label>
                <select asp-for="TaskExecutorId" class="form-control" asp-items="ViewBag.TaskExecutorId"></select> -->
            </div>
            <div class="form-group">
                <input type="submit" value="Create" class="btn btn-default" />
            </div>
        </form>
    </div>
</div>

<div>
    <a asp-action="Index">Back to List</a>
</div>

@section Scripts {
    @{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}

1 回答

  • 0

    _userManager导致此问题 . 这是因为你正在试图改变 User 的变化跟踪和 ForeignKeys 的性质 . 尝试用 _dbContext.Users.ToList() 填充你的下拉列表,虽然它没有't show available in the context that is generated, it'是一个继承礼物 .

    除非您在ApplicationUser中实际创建了该属性,否则您的下拉列表中的 Name 将会出错,因为默认情况下它不存在 . https://github.com/aspnet/Identity/blob/dev/src/Microsoft.Extensions.Identity.Stores/IdentityUser.cs

    public class ApplicationUser : IdentityUser
    {
       public string Name {get;set;}  //?? missing?
    
       public ICollection<UserTask> OwnedUserTasks { get; set; }
       public ICollection<UserTask> ExecutedUserTasks { get; set; }
    }
    

相关问题