Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/31.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# 如何在实体框架应用程序中播种IdentityUser引用?_C#_Asp.net_Entity Framework_Entity Framework 6_Asp.net Identity 2 - Fatal编程技术网

C# 如何在实体框架应用程序中播种IdentityUser引用?

C# 如何在实体框架应用程序中播种IdentityUser引用?,c#,asp.net,entity-framework,entity-framework-6,asp.net-identity-2,C#,Asp.net,Entity Framework,Entity Framework 6,Asp.net Identity 2,我有一个使用ASP.NET Identity 2.2的实体框架应用程序(即,我的上下文继承自IdentityDbContext,我有一个User类继承自IdentityUser)。我正在使用seed方法中的以下调用成功地为AspNetUsers表设定种子: var testUser = new User() { UserName = "TestUser", Email = "TestUser@Domain.tld" }; manager.Create(testUser, "TestPa

我有一个使用ASP.NET Identity 2.2的实体框架应用程序(即,我的上下文继承自
IdentityDbContext
,我有一个
User
类继承自
IdentityUser
)。我正在使用seed方法中的以下调用成功地为
AspNetUsers
表设定种子:

var testUser = new User() {
  UserName = "TestUser",
  Email = "TestUser@Domain.tld"
};

manager.Create(testUser, "TestPassword");
我已经扩展了该模型,以包括一个
Post
类,其中包括对我的
用户
类的引用:

public class Post {

  public Post() {}

  [Required]
  public int Id { get; set; }

  [Required]
  public User User { get; set; }

}
public class User : IdentityUser {

  public User() : base() {
    this.Posts = new HashSet<Post>();
  }

  public ICollection<Post> Posts { get; set; }

  //Additional members...
}
当然,这与我的
User
类中的以下内容相对应:

public class Post {

  public Post() {}

  [Required]
  public int Id { get; set; }

  [Required]
  public User User { get; set; }

}
public class User : IdentityUser {

  public User() : base() {
    this.Posts = new HashSet<Post>();
  }

  public ICollection<Post> Posts { get; set; }

  //Additional members...
}
从技术上讲,这很好;创建了
Post
实例,自动生成的
User\u Id
字段正确填充了新创建的
User
实例的
Id

那有什么问题?每次它运行时,我都会在我的
EntityValidationErrors
中看到以下内容:“用户字段是必需的”。它不会阻止我的应用程序工作,但会使检测合法错误变得困难


显然,我可以将自定义代码添加到我的
DbContext.SaveChanges()
方法中以忽略此错误,但我更想理解为什么会发生此错误,特别是在我如何播种数据时出现问题。

似乎在调用
UserManager.Create()
方法时,它不会用创建引用所需的信息更新
用户
实例。我的假设是它没有填充
Id
字段,但我还没有确认

无论如何,解决方案是在调用
UserManager.Create()
后重新加载用户。我的最终代码如下所示:

var manager = new UserManager<User>(new UserStore<User>(context));

var testUser = new User() {
  UserName = "TestUser",
  Email = "TestUser@Domain.tld"
};

if (manager.Users.Count<User>() == 0) {
  manager.Create(testUser, "TestPassword");
}

testUser = (User)manager
  .Users
  .Where<User>(u => u.UserName == "TestUser")
  .FirstOrDefault<User>();
注意:如果使用
[ForeignKey]
属性,显然有必要通过
Id
(例如,
UserId=testUser.Id
)而不是通过对象引用(例如,
User=testUser
)来分配
用户


在我的实际应用程序中,这一切都被转移到一个
CreateUser()
helper方法,因此创建多个测试用户很容易,但这涵盖了基本内容。这也解决了我的原始代码中的一个缺陷,因为我之前没有检查以确定用户是否已经创建

如果您先插入用户,调用SaveChanges(),然后使用另一个SaveChanges()插入帖子,您是否仍然会遇到此错误?@jeroenvanevel-这不起作用,但我确实找到了解决方案(并且即将发布答案)。