IdentityUser的自定义字段

时间:2015-07-26 21:54:11

标签: asp.net-identity-2

我正在尝试为IdentityUser添加自定义字段。我已经阅读了文档以及我在网上找到的几篇文章。我能够弄清楚如何添加自定义字段,但我不确定如何设置它们的约束。我发现的所有文章都没有涉及这个主题。

    // You can add profile data for the user by adding more properties to your ApplicationUser class, please visit http://go.microsoft.com/fwlink/?LinkID=317594 to learn more.
public class ApplicationUser : IdentityUser
{
    public DateTime RegistrationDate { get; set; }

    public string IPAddress { get; set; }

    public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
    {
        // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
        var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
        // Add custom user claims here
        return userIdentity;
    }
}

我的代码示例如上。我添加了2个字段。 RegistrationDate和IPAddress。我已经使用PowerShell创建迁移并更新数据库。

我的问题是:

  1. 如何为RegistrationDate设置默认值?我希望它是SQL Now()。我可以在迁移后在数据库中进行更改,但这会导致我的代码和数据库不同步。
  2. 在IPAddress上,我希望最大大小为39个字符。当我更新数据库时,该字段创建为NVARCHAR(MAX)NULL。我希望它是NVARCHAR(39)NOT NULL。我无法在IdentityUser中看到这样做。
  3. 最后,如果我想将IPAddress存储为VARBINARY或BINARY,该怎么办?这甚至不是C#接受的数据类型。
  4. 我可以在创建迁移后进入迁移文件并进行一些更改,但这些更改不会反映在数据库中。如果我尝试从PowerShell重新运行Update-database,我会收到一条错误消息,说明没有更新更新。

    最重要的是。我不知道是否应该手动更新迁移文件,因为它们是生成的代码。

        public partial class IPAddress : DbMigration
    {
        public override void Up()
        {
            AddColumn("dbo.AspNetUsers", "IPAddress", c => c.String(nullable: false, maxLength: 39));
        }
    
        public override void Down()
        {
            DropColumn("dbo.AspNetUsers", "IPAddress");
        }
    }
    

    我正在使用Visual Studio 2015和版本4.6。

    由于

1 个答案:

答案 0 :(得分:3)

1)要在RegistrationDate上设置默认日期,您需要创建一个ApplicationUser的默认构造函数,将您的日期设置为您需要的日期:

public ApplicationUser()
{
    RegistrationDate = DateTime.Now();
}

2)要更改字段的大小,您需要在[MaxLength(39)]字段中应用IPAddress属性:

 [MaxLength(39)]
 public string IPAddress { get; set; }

3)要获得BINARY,您需要在C#中使用byte[]类型。 (参考:https://stackoverflow.com/a/1158670/809357

4)您不应手动更改迁移脚本 - 迁移包含数据库的XML快照,并将该快照保留在__MigrationsHistory表中。因此,如果您更改迁移脚本,则不会重新生成快照,并且EF不会获取您的更改。

更改数据模型后,您可以通过add-migration NewMigrationName创建新迁移,或通过update-database -Target PreviousMigrationName将数据库回滚到之前的迁移状态,然后通过add-migration ExistingMigrationName -Force重新生成现有迁移,然后做Update-database