C# ASP.NET核心使用UserManager或实体框架验证扩展表单字段

C# ASP.NET核心使用UserManager或实体框架验证扩展表单字段,c#,asp.net,entity-framework,asp.net-core,C#,Asp.net,Entity Framework,Asp.net Core,我已按照以下步骤构建Razor类库: 我还扩展了我的模型,包括一个名为Office365DomainName的属性: [Required] [Display(Name = "Office 365 Domain Name")] public string Office365DomainName { get; set; } 此属性包含在所有正确的位置,以确保按照 现在,当新用户尝试注册时,我想检查数据库,以确保Office365DomainName值不存在 以下是我尝试过的

我已按照以下步骤构建Razor类库:

我还扩展了我的模型,包括一个名为
Office365DomainName
的属性:

    [Required]
    [Display(Name = "Office 365 Domain Name")]
    public string Office365DomainName { get; set; }
此属性包含在所有正确的位置,以确保按照

现在,当新用户尝试注册时,我想检查数据库,以确保
Office365DomainName
值不存在

以下是我尝试过的:

  • ApplicationDbContext
    注入我的
    Register.cshtml.cs
    文件并执行
    var tenantResult=wait\u context.Tenant.FindAsync(Input.Office365DomainName)但是,这给了我一个关于有主键进行查询的例外。这是有道理的……但如果不先查看数据,我不知道PK是什么(第22条军规)
  • 接下来,我尝试了UserManger的方法,比如
    var foo=await\u userManager.GetUserAsync(User)。但是,由于还没有用户登录,
    user
    不存在
  • 我似乎无法从UserManager中找到满足我需求的内置方法。那么,一个人如何能够在不知道主键的情况下查询实体呢?我可以想象UserManager中的
    CreateAsync
    方法执行此检查以确保其他用户不存在;我只想添加到该功能上,并检查添加的字段

    以下是我的startup.cs相关信息:

    services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(
            Configuration.GetConnectionString("DefaultConnection")));
    
    我表示表单中数据的模型是
    UserRegistrationExtension
    。我以前的尝试是在
    ApplicationDbContext.cs
    中创建
    UserRegistrationExtension
    类型的
    Tenant
    对象。我完全猜到了,但我觉得我走错了方向


    基本上,我假设我需要在这里的某个地方引用我的
    UserRegistrationExtension
    类型,但我不知道在哪里包含它

    您的第一个问题是使用
    FindAsync
    。该方法专门通过主键进行查询,因此当您传递
    Office365DomainName
    值时,它试图查找一条以该值为主键的记录,但显然不是这样。相反,你应该做如下事情:

    await _context.Tenants.SingleOrDefaultAsync(x => x.Office365DomainName == Input.Office365DomainName);
    

    编辑了最后的提问。我在ApplicationDbContext文件中创建了一个
    Tenant
    对象,但这只给了我编译错误,没有引用
    .SingleOrDefaultAsync
    方法。我必须将我的对象名
    Tenant
    放入
    ApplicationDbContent.cs
    中,如下所示:
    public DbSet Tenants{get;set;}
    。成功了!谢谢
    await _context.Tenants.SingleOrDefaultAsync(x => x.Office365DomainName == Input.Office365DomainName);