C# 使用实体框架核心对标识和自定义表关系执行CRUD操作
我有以下dbcontext类:C# 使用实体框架核心对标识和自定义表关系执行CRUD操作,c#,asp.net-core,identity,ef-core-2.0,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
public class AppDbContext : IdentityDbContext<AppUser>
{
public AppDbContext(DbContextOptions<AppDbContext> options)
: base(options) { }
public DbSet<Initiative> initiatives { get; set; }
public DbSet<AppUser> AppUsers {get; set;}
}
我正在尝试创建一个initiative对象,并使用以下代码将其存储到数据库中,该代码引发对象空引用异常:
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 Core在其SaveChanges()
之后分配id,否则不会为该对象分配id
创建计划表并同时更新用户表的最佳方法是什么?您不需要同时更改用户和计划。如果您只留下以下代码,它应该可以工作:
Initiative i = new Initiative(init_model);
i.UserId = _usermgr.GetUserId(HttpContext.User);
_dbContext.initiatives.Add(i);
_dbContext.SaveChanges();
引发“Null引用异常”,因为您的user.user\u\u创建的属性为Null。数据库应用程序体系结构中存在更多错误。我可以查看
AppUser
的类定义吗?@MikeCorcoran AppUser类有一个问题,我没有将getter和setter添加到用户创建的属性中。这个问题由@Nikolay的解决方案解决了。是的,这就是我想要验证的。很高兴你解决了这个问题!是的,这很有效。是的,我忘了将getter和setter添加到用户创建的属性中。那么如何填充AppUser.initiative
?EF core是否在后台自动执行此操作?EF core中的公共DbSet主动性{get;set;}关系由导航属性处理。用户表中的上述属性是导航属性,将用于获取相关实体。(在本例中,它是主动权的集合)EF Core可以用三种不同的方法加载数据:当您添加一个以userId作为外键的主动权时。然后您可以从initiative对象访问相关用户,反之亦然。
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();
Initiative i = new Initiative(init_model);
i.UserId = _usermgr.GetUserId(HttpContext.User);
_dbContext.initiatives.Add(i);
_dbContext.SaveChanges();