【问题标题】:How to merge Identity dbcontext with application context?如何将身份 dbcontext 与应用程序上下文合并?
【发布时间】:2018-05-09 06:33:28
【问题描述】:

我无法读取应用程序身份用户的数据。我是初学者,你知道吗?编译时没有错误。但我无法添加新任务。

创建任务时出现错误https://localhost:44312/usertasks/Create

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

  • 结果视图 展开结果视图将枚举 IEnumerable
  • [0] {lukas@wp.pl} UserTaskTest.Models.ApplicationUser AccessFailedCount 0 整数 ConcurrencyStamp "785f9a54-e7f1-4e3b-8bad-55165155d631" 字符串 电子邮件“lukas@wp.pl”字符串 EmailConfirmed false bool ExecutedUserTasks null System.Collections.Generic.ICollection ID“53f416ab-aa1e-465f-9dd4-dc32e11914ae”字符串 LockoutEnabled true bool LockoutEnd null System.DateTimeOffset? NormalizedEmail "LUKAS@WP.PL" 字符串 NormalizedUserName "LUKAS@WP.PL" 字符串 OwnedUserTasks null System.Collections.Generic.ICollection PasswordHash "AQAAAAEAACcQAAAAEIqkXlzky+4i8BsPl5Z4524B3Dj3u0RZMY2Rf5ch5l22GEMj5m0LsVgeWDAavmVO+g==" 字符串 电话号码空字符串 PhoneNumberConfirmed false bool SecurityStamp "698529ad-c47c-40f9-bdf3-c4d946cda86a" 字符串 TwoFactorEnabled false bool 用户名“lukas@wp.pl”字符串
  • [1] {li@wp.pl} UserTaskTest.Models.ApplicationUser AccessFailedCount 0 整数 ConcurrencyStamp "1a9064e2-3cc9-4794-9198-81423a5d8cd2" 字符串 电子邮件“li@wp.pl”字符串 EmailConfirmed false bool ExecutedUserTasks null System.Collections.Generic.ICollection ID“970839dc-31be-4966-8f06-e664aca3622c”字符串 LockoutEnabled true bool LockoutEnd null System.DateTimeOffset? NormalizedEmail "LI@WP.PL" 字符串 NormalizedUserName "LI@WP.PL" 字符串 OwnedUserTasks null System.Collections.Generic.ICollection 密码哈希“AQAAAAEAACcQAAAAEM2KiwEfRDomBNiWXHmEtvwWEodfZDb8eaSADOGP2ZralzlnBDZEMQIsOvTk1nHMcw==”字符串 电话号码空字符串 PhoneNumberConfirmed false bool SecurityStamp "0a829111-88d7-4a8a-b65d-5582cecbe67f" 字符串 TwoFactorEnabled false bool 用户名“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();
    }
}

用户任务控制器

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

【问题讨论】:

  • 您忘记在 Startup 中显示您实际注册了 ApplicationDbContext。您还忘记了在控制器中显示您从哪里获得context。也忘了显示你实际上在哪里得到那个异常
  • 我添加了代码,创建任务时出现错误localhost:44312/usertasks/Create提前感谢您的帮助
  • 我已编辑您的问题,以便仅显示最相关的详细信息。打电话给_usermanager.Users.ToList() 会给你任何东西吗?我猜桌子是空的。你没有说这是否发生在GET CreatePOST Create
  • GET Create 出现问题,但列表不为空
  • - Microsoft.EntityFrameworkCore.ChangeTracking.LocalView + 非公共成员 - 结果视图 展开结果视图将枚举 IEnumerable + [0] {lukas@wp.pl} UserTaskTest.Models.ApplicationUser + [1] {li@wp.pl} UserTaskTest.Models.ApplicationUser

标签: c# asp.net-core entity-framework-core asp.net-core-identity


【解决方案1】:

_userManager 导致了这里的问题。由于更改跟踪和ForeignKeys 的性质,假设您正在尝试更改User。尝试使用_dbContext.Users.ToList() 填充您的下拉菜单,虽然它不会在生成的上下文中显示可用,但它是一个继承礼物。

此外,下拉列表中的Name 也会出错,除非您实际上在 ApplicationUser 中创建了该属性,因为默认情况下它不存在。 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; }
}

【讨论】:

  • 非常感谢。现在它正在工作。你能告诉我如何在索引和详细视图中显示名称吗?抱歉问了这么多问题。
  • 您是否还可以查看是否是缺少名称属性或用户管理器,现在很确定是名称属性不存在。至于显示属性,请稍等。
猜你喜欢
  • 2018-07-07
  • 1970-01-01
  • 2011-06-30
  • 2016-07-21
  • 2017-06-30
  • 1970-01-01
  • 2015-08-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多