【发布时间】:2017-06-10 21:34:01
【问题描述】:
实体框架 6、MVC5、ASP 身份 2.0。
我已按照这 2 个教程创建 Web 应用程序的登录部分:part 1 - part 2
我从另一个库项目中的 IdentityUser 类创建了自己的 AppUser 类。我也有来自 IdentityDbContext 的数据上下文
public class DataContext: IdentityDbContext<AppUser>
{
public DataContext(): base("DefaultConnection") { }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<AppUser>().Property(u => u.Id).HasDatabaseGeneratedOption(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.Identity);
base.OnModelCreating(modelBuilder);
}
}
public class AppUser : IdentityUser
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[Key]
public override string Id { get; set; }
[Required]
[Display(Name ="First Name")]
[MaxLength(100)]
public string FirstName { get; set; }
[Required]
[Display(Name = "Last Name")]
[MaxLength(100)]
public string LastName { get; set; }
[MaxLength(100)]
public string Title { get; set; }
[Required(ErrorMessage = "Email is required.")]
[Display(Description = "Email")]
public override string Email { get; set; }
[MaxLength(20)]
public string Phone { get; set; }
[Range(0,9999)]
[Display(Name = "Extension")]
public int PhoneExtension { get; set; }
[Display(Name = "Active")]
[DefaultValue(true)]
public bool IsActive { get; set; }
}
当我运行种子方法时,出现以下错误
System.Data.SqlClient.SqlException:无法将值 NULL 插入列 'Id'、表 'CRM1.dbo.AspNetUsers';列不允许空值。插入失败。 声明已终止。
播种方法如下:
protected override void Seed(CRM.DAL.Data.DataContext context)
{
context.AccessLevels.AddOrUpdate(al => al.Label,
new Model.AccessLevel { AccessLevelID = 1, Label = "Admin", Description = "Full access to the CRM data" },
new Model.AccessLevel { AccessLevelID = 2, Label = "Customer Service", Description = "Full access to the CRM data" },
new Model.AccessLevel { AccessLevelID = 3, Label = "Sales", Description = "Full access to the CRM data" }
);
if (!(context.Users.Any(u => u.UserName == "admin@admin.com")))
{
var userStore = new UserStore<AppUser>(context);
var userManager = new UserManager<AppUser>(userStore);
var userToInsert = new AppUser
{
Id = "1",
FirstName = "Admin",
LastName = "Admin",
Title = "Administrator",
Email = "admin@admin.com",
PhoneExtension = 0,
IsActive = true,
AccessLevelID = 1,
EmailConfirmed = true,
PhoneNumberConfirmed = true,
TwoFactorEnabled = false,
LockoutEnabled = false,
AccessFailedCount = 0,
UserName = "admin"
};
userManager.Create(userToInsert, "password");
}
}
所以 Id 得到一个值,但 EF 说它正在插入 NULL。我尝试不给 Id 任何价值,认为 EF 会自动执行但不会。
用我的上下文播种 AspNetUser 的方法是什么?我看到了不同的教程,但它不适用于我扩展的 AppUser 类和 DataContext。
谢谢
【问题讨论】:
-
尝试将 Id 的类型更改为 int 看看会发生什么
-
您能否确认
Id列已创建为标识列? -
@kkkkk 将 Id 更改为 int 表示它与从 IdentityUser 继承的 Id 的类型不匹配
-
@markpsmith Id 在查看数据库架构时未创建为标识列
标签: c# asp.net-mvc entity-framework asp.net-identity