使用实体框架核心的CRUD对身份和自定义表关系的操作

时间:2018-10-12 15:02:10

标签: c# asp.net-core identity ef-core-2.0

我有以下dbcontext类:

public class AppDbContext : IdentityDbContext<AppUser>
{
    public AppDbContext(DbContextOptions<AppDbContext> options)
    : base(options) { }
    public DbSet<Initiative> initiatives { get; set; }
    public DbSet<AppUser> AppUsers {get; set;}
}

AppUsers与initiave具有一对多的关系,如下所示:

public List<Initiative> user_initiatives_created;

倡议的导航属性定义如下:

public string UserId { get; set; }
[ForeignKey("UserId")]
public AppUser User { get; set; } 

我正在尝试创建一个主动对象,并使用以下代码将其存储到数据库中,该代码将引发对象空引用异常:

Initiative i = new Initiative(init_model);
AppUser user = await _dbContext.AppUsers.FindAsync(_usermgr.GetUserId(HttpContext.User));
i.User = user;
i.UserId = _usermgr.GetUserId(HttpContext.User);
user.user_initiatives_created.Add(i); //throws exception
_dbContext.initiatives.Add(i);
_dbContext.AppUsers.Update(user);
_dbContext.SaveChanges();

我认为这是因为i.Id仍为0,因此无法添加到数据库中。但是除非该对象是EF核心,SaveChanges()之后才分配一个ID,否则不会为其分配ID。

创建主动表并同时更新用户表的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

您无需同时更改用户和计划。如果只留下以下代码,它应该可以工作:

Initiative i = new Initiative(init_model);
i.UserId = _usermgr.GetUserId(HttpContext.User);
_dbContext.initiatives.Add(i);
_dbContext.SaveChanges();

因为您的user.user_initiatives_created属性为null,所以引发“空引用异常”。数据库应用程序体系结构中存在更多错误。