Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MVC5 EF6种子方法:无法将NULL插入列';Id';表AspNetUsers_C#_Asp.net Mvc_Entity Framework_Asp.net Identity - Fatal编程技术网

C# MVC5 EF6种子方法:无法将NULL插入列';Id';表AspNetUsers

C# MVC5 EF6种子方法:无法将NULL插入列';Id';表AspNetUsers,c#,asp.net-mvc,entity-framework,asp.net-identity,C#,Asp.net Mvc,Entity Framework,Asp.net Identity,实体框架6,MVC5,ASP Identity 2.0 我按照这两个教程创建了web应用程序的登录部分:- 我从另一个库项目中的IdentityUser类创建了自己的AppUser类。我还有来自IdentityDbContext的数据上下文 public class DataContext: IdentityDbContext<AppUser> { public DataContext(): base("DefaultConnection") { }

实体框架6,MVC5,ASP Identity 2.0

我按照这两个教程创建了web应用程序的登录部分:-

我从另一个库项目中的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; }
}
公共类DataContext:IdentityDbContext
{
public DataContext():基(“DefaultConnection”){}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Entity().Property(u=>u.Id).HasDatabaseGeneratedOption(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.Identity);
基于模型创建(modelBuilder);
}
}
公共类AppUser:IdentityUser
{
[数据库生成(DatabaseGeneratedOption.Identity)]
[关键]
公共重写字符串Id{get;set;}
[必需]
[显示(Name=“First Name”)]
[MaxLength(100)]
公共字符串名{get;set;}
[必需]
[显示(Name=“Last Name”)]
[MaxLength(100)]
公共字符串LastName{get;set;}
[MaxLength(100)]
公共字符串标题{get;set;}
[必需(ErrorMessage=“需要电子邮件”。)]
[显示(Description=“Email”)]
公共重写字符串Email{get;set;}
[MaxLength(20)]
公用字符串电话{get;set;}
[射程(09999)]
[显示(Name=“扩展”)]
公共int电话扩展名{get;set;}
[显示(Name=“活动”)]
[默认值(真)]
公共bool IsActive{get;set;}
}
当我运行seed方法时,我得到以下错误

System.Data.SqlClient.SqlException:无法将值NULL插入表“CRM1.dbo.AspNetUsers”的列“Id”中;列不允许空值。插入失败。 声明已终止

以下是播种方法:

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

    }
受保护的覆盖无效种子(CRM.DAL.Data.DataContext)
{
context.AccessLevels.AddOrUpdate(al=>al.Label,
new Model.AccessLevel{AccessLevelID=1,Label=“Admin”,Description=“对CRM数据的完全访问”},
new Model.AccessLevel{AccessLevelID=2,Label=“Customer Service”,Description=“对CRM数据的完全访问”},
new Model.AccessLevel{AccessLevelID=3,Label=“Sales”,Description=“完全访问CRM数据”}
);
如果(!(context.Users.Any)(u=>u.UserName==)admin@admin.com")))
{
var userStore=新的userStore(上下文);
var userManager=newusermanager(userStore);
var userToInsert=new-AppUser
{
Id=“1”,
FirstName=“Admin”,
LastName=“Admin”,
Title=“管理员”,
电子邮件=”admin@admin.com",
电话分机=0,
IsActive=true,
AccessLevelID=1,
emailconfirm=true,
PhoneNumber确认=真,
TwoFactorEnabled=false,
LockoutEnabled=false,
AccessFailedCount=0,
UserName=“admin”
};
创建(userToInsert,“密码”);
}
}
所以Id得到一个值,但EF说它正在插入NULL。我试图不给Id赋予任何价值,认为EF会自动执行,但没有

使用我的上下文为AspNetUser植入种子的方法是什么?我看到了不同的教程,但它不适用于我的扩展AppUser类和DataContext


谢谢

从代码中删除此行:

modelBuilder.Entity<AppUser>().Property(u => u.Id).HasDatabaseGeneratedOption(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.Identity);
您不需要重写此属性,只需使用父属性(实体框架将映射它)

解释:当您像配置属性那样配置
Id
属性时,您告诉实体框架属性值来自数据库,因此它完全忽略了插入数据库时传递给此属性的值

另一方面,如果数据库表中的列没有默认值,它将失败,因为EntityFramework没有为它提供值

所以您需要决定:要么您的表必须有一个默认值,要么您应该删除该字段的
HasDatabaseGeneratedOption
选项

问题是
IdentityUser
使用
字符串作为键,通常是
Guid
。由于EF不会自动为您生成
Id
,您的列也不会,因此您可以为
用户创建
构造函数
,方法如下:

public AppUser()
{
    Id = Guid.NewGuid().ToString();
}
无论何时创建新用户,它都将有一个新的
Guid
作为Id….当您从上下文中读取现有用户时,虽然您的构造函数将在EF实例化时生成它,但EF随后将从表中加载
Id
值(忽略构造函数中提供的值)


这意味着您的构造函数中自动生成的Guid将仅用于新实例。

以下情况发生在我身上。我按照此指南将ASP.NET标识中用户的主键从Guid更改为Int

我已经进行了一些迁移,因此EF尝试将Id从nvarchar(128)更改为int。这起到了作用,但
标识规范
从未从“否”更改为“是”。解决方法是删除所有以前的迁移,删除数据库,然后对所有更改进行新迁移。因为我们在开发早期,所以这不是一个问题


尝试将Id的类型更改为int,看看会发生什么情况。您可以确认
Id
列已创建为标识列吗?@kkkk将Id更改为int表示它与从中继承的Id的类型不匹配IdentityUser@markpsmith在查看DBI的架构时,不会将Id创建为标识列只要拆下那条线,我就可以得到sa
public AppUser()
{
    Id = Guid.NewGuid().ToString();
}