【问题标题】:AspNetUsers to IdentityUser with Entity Framework CoreAspNetUsers 到 IdentityUser 与 Entity Framework Core
【发布时间】:2019-08-29 07:09:34
【问题描述】:

背景

我有一个用 C# 和 ASP.NET 核心 (v2.2) 编写的项目。该项目连接到一个数据库,该数据库包含一个名为“AspNetUsers”的表。构建策略是“数据库优先”。

我正在使用以下命令从数据中构建模型:

Scaffold-DbContext "...DB-CS..." PROVIDER -Context UsersDB -f -OutputDir Processes\Models

然后它为我创建了这个映射类:

public partial class AspNetUsers
{
    public AspNetUsers()
    {

    }
    public string Id { get; set; }
    public DateTime RegistrationTime { get; set; }
    // ...
}

在我的网站上,我使用的是 UserManager 类。此类期望获得一个继承自 IdentityUser 接口的 Object。

问题:

这是否可以让我的AspNetUsers 类实现IdentityUser

谢谢!

更新 #1

感谢@Darjan Bogdan 的回答,我创建了这个新文件:

public partial class AspNetUsers : IdentityUser
{
}

并将我的UserManager 更改为如下所示:

private UserManager<AspNetUsers> UserManager { get; set; }

乍一看,它看起来像工作。当深入检查时 - 我遇到了许多奇怪的错误,例如:

User security stamp cannot be null.

虽然 AspNetUsers 实例 具有 SecuriyStamp 字段(非空)。 我检查了AspNetUsers 文件(自动生成),似乎有些属性隐藏另一个。

问题:我在数据库优先模型中工作。因此,AspNetUsers 文件是自动生成的。如何避免隐藏其他属性?

【问题讨论】:

    标签: c# asp.net asp.net-core asp.net-membership


    【解决方案1】:

    您可以轻松做到,代码生成器创建partialclasses 是有原因的。

    所以,为了让AspNetUsers 继承IdentityUser,您只需要在另一个(未生成的)文件中定义以下内容,例如AspnetUsers.Partial.cs 文件:

    public partial class AspnetUsers : IdentityUser
    {
    
    }
    

    请注意,您不应更改生成的文件,而应创建自己的文件夹,在其中添加带有部分类的其他文件。

    值得一提的是,扩展部分类时需要使用相同的命名空间

    【讨论】:

    • 似乎这个建议让我们更接近解决方案。请在我的问题上查看Update #1
    • @No1Lives4Ever 似乎您的数据库架构并未完全遵循仅在使用 IdentityUser 类时创建的默认数据库架构。因此,为了使其工作,您应该覆盖部分类中不同的属性(例如 Null/NotNull、不同的长度等)。除此之外,您可能需要使用自己的IdentityDbContext&lt;AspnetUsers&gt;,在其中您将通过OnModelCreating 方法覆盖默认配置,以使其适应您“稍微”不同的模式。之后,您需要使UserManager 使用UserStore,它使用您的自定义DbContext
    【解决方案2】:

    除非您有自定义数据,否则您实际上不需要实现 IdentityUser

    using System;
    
    namespace WebApp1.Areas.Identity.Data
    {
        public class WebApp1User : IdentityUser
        {
            [PersonalData]
            public string Name { get; set; }
            [PersonalData]
            public DateTime DOB { get; set; }
        }
    }
    

    看这里Microsoft docs

    【讨论】:

      【解决方案3】:

      是的,这是可能的,这是您应该这样做的正常方式。在您的情况下,从自动生成的 AspNetUser 类中删除从 IdentityUser 继承的属性,并仅保留未继承的属性。

      public class AspNetUser : IdentityUser<string> 
      {
          public DateTime RegistrationTime { get; set; }
          public string OtherPros {get;set;},
      }
      

      然后您可以将 AspNetUser 类与 UserManager 一起使用。

      干杯,

      【讨论】:

        【解决方案4】:

        试试这个

        public partial class AspNetUsers : IdentityUser
        {
            public AspNetUsers()
            {
        
            }
            public string Id { get; set; }
            public DateTime RegistrationTime { get; set; }    
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-02-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-08-05
          相关资源
          最近更新 更多